Exact repair regenerating codes for distributed storage systems

ABSTRACT

A distributed storage system includes a plurality of nodes comprising a first node, wherein a total number of nodes in the distributed storage system is represented by n, wherein a file stored in the distributed storage system is recovered from a subset of a number of nodes represented by k upon a file failure on a node in the distributed storage system, and wherein a failed node in the plurality of nodes is recovered from a number of helper nodes of the plurality of nodes represented by d. Upon detecting a failure in the first node, each helper node of the number of helper nodes is configured to determine a repair-encoder matrix, multiply a content matrix by the repair-encoder matrix to obtain a repair matrix, extract each linearly independent column of the repair matrix, and send the linearly independent columns of the repair matrix to the first node.

This application claims the benefit of U.S. Provisional Patent Application No. 62/863,780, filed on Jun. 19, 2019, the entire content of which is incorporated herein by reference.

GOVERNMENT INTEREST

This invention was made with government support under CCF-1617884 awarded by the National Science Foundation. The government has certain rights in the invention.

TECHNICAL FIELD

The disclosure relates to failure recovery for distributed storage systems.

BACKGROUND

The dynamic, large and disparate volume of data garnered from social media, Internet-driven technologies, financial records, and clinical research has created an increasing demand for reliable and scalable storage technologies. Distributed storage systems are widely being used in modern data centers. In distributed storage systems individual storage nodes are often unreliable due to various hardware and software failures. Hence redundancy is introduced to improve the system's reliability in the presence of node failures. The simplest form of redundancy is the replication of the data in multiple storage nodes. Even though it is the most common form of redundancy, replication is very inefficient in terms of the offered reliability gain per cost of the extra storage units required to store the redundancy. In this context, coding techniques have provably achieved orders of magnitude more reliability for the same redundancy compared to replication. Besides reliability offered by storing the redundant data, in order to be durable, it is necessary for a storage system to repair the failed nodes. The repair process consists of downloading (part of) the content of a number of surviving nodes to reconstruct the content of the failed nodes. The conventional erasure codes suffer from high repair-bandwidth due to the total size of data to be downloaded for repair of each failed node. Regenerating codes is a class of erasure codes that have gained popularity in this context, due to their low repair-bandwidth while providing the same level of fault tolerance as erasure codes.

BRIEF DESCRIPTION OF DRAWINGS

FIG. 1 is a conceptual diagram illustrating an example achievable trade-off of the techniques described herein.

FIG. 2 is a conceptual diagram illustrating an example comparison of the maximum files size (F) of two codes, in accordance with the techniques described herein.

FIG. 3 is a conceptual diagram illustrating an example linear trade-off for a system d=4 together with achievable corner points, in accordance with the techniques described herein.

FIG. 4 is a conceptual diagram illustrating an example normalized repair bandwidth (by per-node storage size) for multiple failures with e failed nodes, for an (n, 10,10) determinant code operating at mode m=3, i.e, (α, β, F)=(120,36,990), in accordance with the techniques described herein.

FIG. 5 is a conceptual diagram illustrating an example cascading of determinant codes, in accordance with the techniques described herein.

FIG. 6 is a conceptual diagram illustrating an example symbol injection, in accordance with the techniques described herein.

FIG. 7 is a conceptual diagram illustrating an example hierarchical tree for an (n, k=4, d=6; μ=4) code, in accordance with the techniques described herein.

FIG. 8 is a conceptual diagram illustrating an example participation of the helper nodes in the multiple failure repair of the super-code, in accordance with the techniques described herein.

FIG. 9 is a block diagram of one example of a more detailed view of a node device that may be configured to perform one or more techniques in accordance with the current disclosure.

FIG. 10 is a flow diagram of one or more techniques of the current disclosure.

DETAILED DESCRIPTION

A novel coding scheme for exact repair-regenerating codes is presented in this application. The codes proposed in this application can trade between the repair bandwidth of nodes (number of downloaded symbols from each surviving node in a repair process) and the required storage overhead of the system. These codes work for general system parameters (n, k, d), the total number of nodes, the number of nodes suffice for data recovery, and the number of helper nodes in a repair process, respectively. The proposed construction offers a unified scheme to develop exact-repair regenerating codes for the entire trade-off, including the MBR and MSR points. The new storage-vs.-bandwidth trade-off achieved by the disclosed codes may be optimum. Some other key features of this code include: the construction is linear, the required field size is only Θ(n), and the (unnormalized) code parameters (and in particular sub-packetization level) is at most (d−k+1)^(k), which is independent of the number of the parity nodes. Moreover, the proposed repair mechanism is helper-independent, that is the data sent from each helper only depends on the identity of the helper and failed nodes, but independent from the identity of other helper nodes participating in the repair process.

While individual storage units in distributed storage systems (DSS) are subject to temporal or permanent failure, the entire system may be designed to avoid losing the stored data. Coding and storing redundant data is an approach to guarantee durability in such systems. Moreover, these systems are equipped with a repair mechanism that allows for a replacement of a failed node. Such replacement can be performed in the functional or exact sense. In functional repair, a failed node may be replaced by another one, so that the consequent family of nodes maintains the data recovery and node-repair properties. In an exact repair process, the content of a failed node may be exactly replicated by the helpers.

Regeneration codes are introduced to manage data recovery and node repair mechanism in DSS. Formally, an (n, k, d) regeneration code with parameters (α, β, F) encodes a file comprised of F symbols (from a finite field

) into n segments (nodes) W₁, W₂, . . . , W_(n) each of size α, such that two important properties are fulfilled: (1) the entire file can be recovered from every subset of k nodes, and (2) whenever a node fails (become inaccessible), it can be repaired by accessing d remaining nodes and downloading β symbols from each.

It turns out that there is a fundamental trade-off between the minimum required per-node storage α and the repair-bandwidth β, to store a given amount of data F in a DSS. This tradeoff is fully characterized to be achievable by random network coding. However, for the exact-repair problem, which is notably important from the practical perspective, characterization of the trade-off and design of optimum codes are widely open, except for some special cases. Construction of exact-repair regenerating codes for a system with arbitrary parameters (n, k, d) is a complex task due to several combinatorial constraints to be satisfied. The number of such constraints dramatically increases with n, the total number of nodes in the system.

In an (n, k, d) regenerating code, a file comprised of F data symbols, each from a finite field

is encoded into n pieces, and each piece may be stored one storage node of capacity α symbols. The stored data in the nodes may maintain two main properties:

1. Data Recovery: By accessing any set of k nodes, the data collector is able to recover the original stored file.

2. Node Repair: In the event of node failure, the content of the failed node can be regenerated by connecting to any subset of

nodes of size |

|=d, and downloading β symbols from each. The set

is called the set of helper nodes.

There is tension between the two properties: while large parity groups are preferred for efficient data recovery, the repair process requires more downloads if the parity groups including each missing symbol are large. This is due to the fact that every symbol, except the missing one, in a parity equation may be downloaded before retrieving the missing one. More formally, it is shown that there is a trade-off between the per-node storage capacity α and the per-node repair-bandwidth β in a storage system that can guarantee the main properties for a file of size F. While it is desired to minimize both α and β, one can be reduced only at the cost of increasing the other.

There are two types of node repairs: (i) functional-repair, where a failed node may be replaced by a new node such that the resulting system continues to satisfy the data collection and node-repair properties. An alternative to function repair is (ii) exact-repair, under which the replaced node stores precisely the same content as the failed node. Hence, exact-repair is a more demanding criterion, and it is expected to require more repair bandwidth in comparison to functional repair, for a given storage size. However, from the practical stand, the exact repair is preferred, since it does not need the extra overhead of updating the system configuration.

The regenerating codes include (n, k, d) distributed storage systems, which are studied using information flow graphs. Moreover, using the cut-set bound, it is shown that the per-node storage capacity α, the per-node repair bandwidth β, and the file size F may satisfy

$\begin{matrix} {{F \leq {\sum\limits_{i = 1}^{k}{\min\left( {\alpha,{\left( {d - i + 1} \right)\beta}} \right)}}},} & (1) \end{matrix}$ for a storage system that maintains data recovery and node repair properties. This bound implies a trade-off between α and β for a given F. This trade-off is shown to be achievable for the functional repair using random codes. An important follow-up question was whether the same trade-off (1) is achievable with the exact-repair property. First, it was shown that exact-repair regenerating codes can be constructed for the extreme points of the trade-off, namely, the minimum bandwidth regeneration (MBR) referring to the minimum β satisfying (1), and the minimum storage regeneration (MSR), referring to the minimum α for which (1) can be satisfied for a given F. Later, it was shown that some of the interior (between the two extreme) points of the trade-off are not achievable under the exact repair criterion. While the proof does not rule out the possibility of approaching the non-achievable trade-off points with an arbitrary small gap, the next question was whether there is a non-vanishing gap between the trade-off of exact-repair and functional-repair codes. This question was first answered by using the computer-aided approach of information-theoretic inequalities, the techniques described herein completely characterized the trade-off for an (n, k, d)=(4,3,3) systems. Note that (4,3,3) is the smallest system for which there is a non-vanishing gap between functional and exact repair trade-off.

Thereafter, the attention of the data storage community has shifted to characterizing the optimum storage-bandwidth trade-off for the exact-repair regenerating codes. A trade-off characterization consists of two-fold: (i) designing the code constructions that has data recovery and exact node repair properties, achieving pairs of (α, β), and (ii) proving information-theoretic arguments that provide lower bound for the achievable pairs of (α, β). The focus of this disclosure is on code construction part, and hence, a brief review of the existing code constructions is provided. To this end, there are three main categories based on the achievable trade-offs, as follows.

1. The MBR point: This point was fully solved for general (n, k, d), where it is shown that the functional-repair trade-off is also achievable under the exact-repair criterion.

2. The MSR point: Most of the existing code constructions are dedicated to the MSR point. A computer search was carried out to find an (n=5, k=3, d=4) MSR code. The code constructions for general (n, k, d) parameters can be divided into (i) regime of low-rate codes where k/n≤½ and (ii) practically more important regime of high-rate codes where k/n>½. The proposed construction for parameters satisfying d>2k−2 includes two steps: first a code is developed with d′=2k′−2, and then converted to a code with desired (k, d) parameters. The code construction was unified for all parameters d≥2k−2. The code construction for the high rate codes of d<2k−2 remained as an open problem.

It is shown that the exact-repair MSR code (for both low rate and high rate regimes) is achievable in the asymptotic sense, that is when the file size is growing unboundedly. However, the proof was existential and no explicit code construction was provided.

Explicit code construction for the high-rate regime is a more challenging problem and several disclosures have been appeared to improve the state-of-the-art. The code constructions are limited to the repair of only systematic nodes. Another category of code constructions is dedicated to codes with a limited number of parity nodes. In particular, Hadamard matrices are used to construct the first explicit MDS storage code with only 2 parities (n=k+2), that offer an optimum repair-bandwidth for the repair of any single node failure, including the parities.

Sub-packetization level, referring to the unnormalized value of α in terms of the number of symbols, is a practically important parameter of any code construction. While it is preferred to minimize the sub-packetization level, it can be lower than a certain lower bound. A class of MSR codes is introduced which requires only polynomial sub-packetization in k, but a very large field size. Nevertheless, the proposed construction is not fully explicit, and it is limited parameters satisfying n=d−1. The latter restriction was later relaxed, where the same result is shown for an arbitrary number of helper nodes.

Several MSR code constructions for arbitrary parameters (n, k, d) are recently proposed. They are all optimum in terms of the storage vs. repair-bandwidth trade-off, and all achieve the optimum sub-packetization matching the bound. The codes proposed offer a dynamic repair, where the number of helpers is flexible to be varied between k and n−1.

The proposed codes in this work cover the entire trade-off, including the MSR point. In the resulting MSR codes from proposed construction, the code parameters and especially the sub-packetization level do not depend on the total number of nodes n. Also, another advantage of this construction is its flexibility of system expansion by adding new parity nodes.

In contrast to other existing codes in the literature where the entire code needs to be redesigned if the total number of nodes increases, the proposed construction here allows for adding new parity nodes to the system, without changing the content of the other nodes. A comparison between the MSR code obtained from this construction and the existing codes, in terms of required field size and the sub-packetization level is presented in Table 1.

TABLE 1 Comparison between code constructions proposed for the MSR point. Sub-packetization Code level α Field size q Parameters Ex. 1 (n − k)^(n) q ≥ (n − k)n n = d + 1 Ex. 2 (n − k)^(n−1) q ≥ n n = d + 1 Ex. 3 (d − k + 1)^(n) q ≥ sn for s = d < n − 1 lcm(1, 2, . . . , n − k) Ex. 4 $\left( {n - k} \right)^{\lceil\frac{n}{n - k}\rceil}$ $q \geq {\left( {n - k} \right)\left\lceil \frac{n}{n - k} \right\rceil}$ n = d + 1 Ex. 5 $\left( {n - k} \right)^{\lceil\frac{n}{n - k}\rceil}$ $q \geq {\left( {n - k} \right)\left\lceil \frac{n}{n - k} \right\rceil}$ n = d + 1 Ex. 6 $\left( {n - k} \right)^{\lceil\frac{n}{n - k}\rceil}$ q ≥ n n = d + 1 The techniques (d − k + 1)^(k) q ≥ n All described herein

3. Interior points: The construction for the interior points (trade-off points except for MBR and MSR) were restricted to the specific system parameters. The optimum code construction for (n=d+1, k=d, d) was presented. The achievable trade-off is shown to be optimum under the assumption of the linearity of the code. However, it wasn't clear that if the same trade-off is achievable for n>d+1. Most of the follow-up efforts to increase the number of parity nodes resulted in compromising the system capacity to construct the code for larger values of the n, and hence their trade-off was diverging from the lower bound, and n increases. The first n-independent achievable trade-off for interior points, where, for any (n, k=d, d) system, the trade-off corner point next to MSR can be achieved. However, the proof is just an existence proof, where a random ensemble of codes are introduced, and it is shown that for any n, there exists at least one code in the ensemble that satisfied both data recovery and node repair properties.

The above-mentioned restriction for n was uplifted as an explicit code construction for the entire trade-off of an (n, k=d, d) storage system. The proposed determinant codes are optimal, and achieve the lower bound, regardless of the total number of nodes. However, the repair process of the determinant codes requires heavy computation, and more importantly, the repair data sent from a helper node to a failed node depends on the identity of the other helpers participating in the repair process. This issue was resolved by introducing a new repair mechanism.

The next set of works focus on breaking the last constraint, i.e., k=d. An explicit code construction was introduced for an (n, k≤d, d) system. The resulting trade-off was improved by the code construction. A class of improved layered code was introduced. However, it turns out that the resulting trade-off in only optimum for the corner point next to the MBR, and only for an (n=d+1, k, d) system. The techniques described herein generalize the parameter d to be any free parameter. However, the construction is dedicated to a trade-off point next to the MBR, implying low repair bandwidth. The result was extended for entire trade-off but only for an (n, k=d−1, d) system. The techniques described herein include a code construction for general (n, k, d) parameter for the entire trade-off with a better resulting trade-off.

Determinant codes are a family of exact repair regenerating codes for a DSS with parameters (n, k=d, d). The main property of these codes is to maintain a constant trade-off between α/F and β/F, regardless of the number of the nodes. In particular, these codes can achieve the lower bound, and hence they are optimum. The determinant codes have a linear structure and can be obtained from the inner product between an encoder matrix and the message matrix. Especially, product-matrix codes for MBR and MSR points can be subsumed from the general construction of the determinant codes.

The repair mechanism proposed for the determinant codes requires a rather heavy computation at the helper nodes in order to prepare their repair symbols to send to the failed node. More importantly, each helper node h∈

needs to know the identity of all the other helper nodes participating in the repair process. The assumption of knowing the set of helpers in advance is a limitation of the determinant codes, and it is undesired in real-world systems. In practice, it is preferable that once a request for a repair of a failed node is made, each node can independently decide to whether or not to participate in the repair process and generate the repair data from its content, regardless of the other helper nodes.

On the other hand, besides the repair bandwidth, one of the crucial bottlenecks in the performance of the storage systems is the I/O load, which refers to the amount of data to be read by a helper node to encode for a repair process. While the native constructions for exact repair generating code require a heavy I/O read, the repair-by-transfer (RBT) codes offer an optimum I/O. An elegant modification is proposed to improve the I/O cost of product-matrix MSR codes, by pre-processing the content of the nodes and storing the repair data on non-systematic nodes instead of the original node content. This results in a semi-RBT code: whenever such modified nodes contribute in a repair process, they merely transfer some of their stored symbols without any computation. Such modification could not be applied on the original determinant codes since the repair symbols from a helper node h to a failed node f could be computed only when the set of other helper nodes

is identified.

The techniques described herein propose a novel repair mechanism for the determinant codes. In the new repair procedure, data repair symbols from helper node h to a failed node f solely depend on the content of the helper node and the identity of the failed node f. The failed node collects a total of dβ repair symbols from the helper nodes and can reconstruct all of its missing symbols by simple addition and subtraction of some of the received symbols. This simple repair scheme further allows for modifications, to further improve the I/O overhead of the code.

The equations used throughout this disclosure may use lowercase letters to denote numbers (e.g., integers k and d or Galois field numbers v and w), and bold symbols to denote matrices. For positive integers a and b, denote set {a, a+1, . . . , b−1, b} by [a: b], and set {1, 2, . . . , b} by [b]. Hence, for a>b, [a: b]=ø. Script-font letters (e.g.,

and

to denote a set of integer number). Hence x∈

implies integer x belongs to the set

. The largest entry of a set

is denoted by max

, and the maximum of an empty set is defined as maxø=−∞ for consistency. For two sets

and

with |

|=|

| write

to indicate the lexicographical order between

and

, e.g., {1,2,3}

{1,2,4}

{1,2,5}

{1,3,4}

{1,3,5}. For an integer x and a set

, define

$\begin{matrix} {{{ind}_{\mathcal{J}}(x)} = {{❘\left\{ {y \in {{\mathcal{J}:y} < x}} \right\} ❘}.}} & (2) \end{matrix}$

For a matrix X and a set

, denote the sub-matrix of X obtained from the rows in

by X[

, :].

Note that k and d (with k≤d) are the main system parameters throughout the disclosure. For a fixed k and a subset

⊆[d], define

=

∩[k] and

=

∩[k+1: d]. Similarly, for a matrix P with d rows, define P and P to be sub-matrices of P obtained from stacking the top k and the bottom (d−k) rows of a matrix P, respectively.

The second contribution of this work is the simultaneous repair for multiple failures. Although single failures are the dominant type of failures in distributed storage systems, multiple simultaneous failures occur rather frequently and need to be handled in order to maintain the system's reliability and fault-tolerance. The naive approach to deal with such failures is to repair each failed node individually and independently from the others. This requires a repair bandwidth from each helper node that scales linearly with the number of failures. There are two types of repair for multiple failures studied: (i) centralized regenerating codes and (ii) cooperative regenerating codes. In centralized regenerating codes, a single data center is responsible for the repair of all failed nodes. More precisely, once a set of e nodes in the system fail, an arbitrary set of d≤n−e nodes are chosen, and β_(e) repair symbols may be downloaded from each helper node. This leads to a total of d·β_(e) symbols which may be used to repair the content of all the failed nodes. The storage-bandwidth trade-off of these codes are studied for two extreme points, namely the minimum storage multi-node repair (MSMR) and the minimum bandwidth multi-node repair (MBMR) points. In particular, a class of MSMR code is introduced, that are capable of repairing any number of failed nodes e≤n−k from any number of helper nodes k≤d≤n−e, using an optimal repair bandwidth. In cooperative regenerating codes upon failure of a node, the replacement node downloads repair data from a subset of d helper nodes. In the case of multiple failures, the replacement nodes not only download repair data from the helper nodes, but also exchange information among themselves before regenerating the lost data, and this exchanged data between them is included in the repair bandwidth. Similar to the centralized case, the trade-off for these codes for the two extreme points, namely the minimum bandwidth cooperative regeneration (MBCR) codes and the minimum storage cooperative regenerating (MSCR) codes are studied. In particular, explicit constructions of MDS codes with optimal cooperative repair for all possible parameters were introduced. Also, they have shown that any MDS code with optimal repair bandwidth under the cooperative model also has optimal bandwidth under the centralized model.

The techniques described herein show that the repair bandwidth required for multiple failures repair in determinant codes can be reduced by exploiting two facts: (i) the overlap between the repair space (linear dependency between the repair symbols) that each helper node sends to the set of failed nodes, and (ii) in the centralized repair, the data center (responsible for the repair process) can perform the repair of the nodes in a sequential manner, and utilize already repaired nodes as helpers for the repair of the remaining failed nodes. Interestingly, using these properties the techniques described herein can limit the maximum (normalized) repair-bandwidth of the helper nodes to a certain fraction of α, regardless of the number of failures. The structure of the code allows us to analyze this overlap, and obtain a closed-form expression for the repair bandwidth. The codes are not restricted only to the extreme points of the trade-off and can operate at any intermediate point on the optimum trade-off. A similar problem is where a class of codes is introduced to operate at the intermediate points of the trade-off, with an improved repair bandwidth for multiple failures. However, this improvement is obtained at the price of degradation of the system's storage capacity as n (the total number of nodes) increases. Consequently, the resulting codes designed for two or more simultaneous failures are sub-optimum, and cannot achieve the optimum trade-off between the per-node capacity, repair bandwidth, and the overall storage capacity. One of the main advantages of the proposed code and repair mechanism is to offer a universal code, which provides a significant reduction in the repair bandwidth for multiple failures, without compromising the system performance.

Throughout the analysis, the techniques described herein frequently need to concatenate several matrices, that is, merging a number of matrices with the same number of rows side-by-side, to form a fat matrix with the same number of rows.

The main contribution of this disclosure is a novel construction for exact-repair regenerating codes, with arbitrary parameters (n, k, d). The following theorem characterizes the achievable storage vs. repair-bandwidth trade-off of the proposed code construction.

The techniques described herein use [k+1: d] to denote the set of integer numbers {k+1, . . . , d}, and [k]=[1: k] to represent the set {1, 2, . . . , k}. For a set

and a member x∈

, define

(x)=|{y∈

:y≤x}|. Boldface symbols refer to matrices, and for a matrix X, denote its i-th row by X_(i). The techniques described herein also use the notation X_(:,j) to refer to the j-th column of X. Moreover, use X[

,

] to denote a sub-matrix of X obtained by rows i∈

and columns j∈

. Accordingly, X[

, :] denotes the sub-matrix of X by stacking rows i ∈

. Moreover, the techniques describe herein may use sets to label rows and/or columns of a matrix, and hence

refers to an entry of matrix X at the row indexed by

and the column labeled by

. Finally, for a set

, denote the maximum entry of

by max

.

The optimum storage repair-bandwidth of the exact-repair regenerating codes for an (n, k=d, d) system is a piece-wise linear function, which is fully characterized by its corner (intersection) points. The determinant codes provide a universal construction for all corner points on the optimum trade-off curve. The techniques described herein assign a mode (denoted by m) to each corner point, which is an integer in {1, 2, . . . , d}(from 1 for MBR to d for MSR point). The main distinction between the result of the techniques described herein and previous results is the fact that the repair data sent by one helper node does not depend on the identity of all the other helper nodes participating the repair process. The following definition formalizes this distinction.

Theorem 1: For a distributed storage system with arbitrary parameters (n, k, d), the triple (α, β, F) defined as

$\begin{matrix} {{{\alpha\left( {d,\ {k;\mu}} \right)} = {\sum\limits_{m = 0}^{\mu}{\left( {d - k} \right)^{\mu - m}\begin{pmatrix} k \\ m \end{pmatrix}}}}{{\beta\left( {d,\ {k;\mu}} \right)} = {\sum\limits_{m = 0}^{\mu}{\left( {d - k} \right)^{\mu - m}\begin{pmatrix} {k - 1} \\ {m - 1} \end{pmatrix}}}}{{F\left( {d,\ {k;\mu}} \right)} = {{\sum\limits_{m = 0}^{\mu}{{k\left( {d - k} \right)}^{\mu - m}\begin{pmatrix} k \\ m \end{pmatrix}}} - {\begin{pmatrix} k \\ {\mu + 1} \end{pmatrix}.}}}} & \left( {3A} \right) \end{matrix}$

is achievable for μ∈{1, . . . , k}.

Definition 1: Consider the repair process of a failed node f using a set of helper nodes

. The repair process is called helper-independent if the repair data sent by each helper node h∈

to the failed node f only depends on f and the content of node h (but not the other helpers participating in the repair process).

The following theorem formally states the trade-off achievable by determinant codes.

Theorem 1: For an (n, k=d, d) distributed storage system and any mode m=1, 2, . . . , d, the triple (α, β, F) with

$\begin{matrix} {\left( {\alpha^{(m)},\ \beta^{(m)},\ F^{(m)}} \right) = \left( \ {\begin{pmatrix} d \\ m \end{pmatrix},\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix},{m\ \begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix}}} \right)} & \left( {3B} \right) \end{matrix}$

can be achieved under helper-independent exact repair by the code construction proposed in this disclosure. The proposed trade-off is shown in FIG. 1, and is compared against that of other existing codes.

FIG. 1 is a conceptual diagram illustrating the achievable trade-off of the proposed code for (n=8, k=4, d=6), and its comparison to other known codes with these parameters. The proposed trade-off has k=4 corner points, enumerated with μ=1, 2, 3, 4.

The novel repair process presented here has the advantage that the repair data sent by a helper node does not depend on the identity of other helpers participating in the repair process. Moreover, the techniques described herein present a repair mechanism for multiple simultaneous failures. The proposed scheme exploits the overlap between the repair data sent for different failed nodes and offers a reduced repair-bandwidth compared to naively repairing the failed nodes independent of each other.

The code construction is reviewed in this discosure for completeness. In order to prove Theorem 1, it suffices to show that the proposed code satisfies the two fundamental properties, namely data recovery and exact node repair. The proof data recovery property is similar to that of Proposition 1, and hence omitted here. The exact-repair property is formally stated in Proposition 2. Moreover, Proposition 1 shows that the repair bandwidth of the proposed code does not exceed β^((m)). This is also proved in this disclosure.

FIG. 2 is a conceptual diagram illustrating a comparison of the maximum files size (F) of two codes, in accordance with the techniques described herein. For example, FIG. 2 illustrates a comparison of the maximum files size (F) of two (n≥7, k=4, d=6) exact-regenerating codes, and code parameters (α, β)=(18, 5). When the distributed storage system has only n=d+1=7, both codes can store F=68 units of data. However, for a sufficiently large field size, the storage capacity decays as a function of, while the storage capacity is preserved for the cascade code described herein. In the cascade code construction, the pair (α,β)=(18, 5) corresponds to a code construction with μ=2.

FIG. 2 compares the scalability aspect of the code construction described herein with an existing construction. The term scalability refers to the property that the number of nodes in a distributed storage system can be increased (for a sufficiently large field size) without compromising the system performance, and its overall capacity.

FIG. 3 is a conceptual diagram illustrating the linear trade-off for a system d=4 together with achievable corner points of this disclosure are depicted.

Remark 1 Theorem 1 offers an achievable trade-off for the normalized parameters (α/F, β/F) given by

$\begin{matrix} {\left( {\frac{\alpha^{(m)}}{F^{(m)}},\ \frac{\beta^{(m)}}{F^{(m)}}} \right) = \ {\left( {{\begin{pmatrix} d \\ m \end{pmatrix}/{m\ \begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix}}},{\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}/{m\ \begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix}}}} \right) = {\left( {\frac{m + 1}{m\left( {d + 1} \right)},\frac{m + 1}{d\left( {d + 1} \right)}} \right).}}} & \left( {3C} \right) \end{matrix}$

It is shown that for any linear exact-repair regenerating code with parameters (n, k=d, d) that is capable of storing F symbols, (α, β) may satisfy

$\begin{matrix} {{F \leq {\frac{d + 1}{\ell + 2}\left( {{\ell\;\alpha} + {\frac{d}{\ell + 1}\beta}} \right)}},} & \left( {3D} \right) \end{matrix}$

where

=└dβ/α┘ takes values in {0, 1, . . . , d}. This establishes a piece-wise linear lower bound curve, with d (normalized) corner points obtained at integer values of

=dβ/α. For these corner points, the (normalized) operating points (α/F, β/F) are given

$\left( {\frac{\alpha}{F},\ \frac{\beta}{F}} \right) = {\left( {\frac{\ell + 1}{\ell\left( {d + 1} \right)},\frac{\ell + 1}{d\left( {d + 1} \right)}} \right).}$

These operating points are matching with the achievable (normalized) pairs given in (2). Therefore, determinant codes are optimal, and together with the lower bound fully characterize the optimum trade-off for exact-repair regenerating codes with parameters (n, k=d, d). The next result of this disclosure provides an achievable bandwidth for multiple repairs.

Theorem 2: In an (n, k=d, d) determinant codes operating at mode m, the content of any set of e simultaneously failed nodes can be exactly repaired by accessing an arbitrary set of d nodes and downloading

$\beta_{e}^{(m)} = {\begin{pmatrix} d \\ m \end{pmatrix} - \begin{pmatrix} {d - e} \\ m \end{pmatrix}}$

repair symbols from each helper node.

The repair mechanism for multiple failures is similar to that of single failure presented in Proposition 2. In order to prove Theorem 2, it suffices to show that the repair bandwidth required for multiple failures does not exceed β_(e) ^((m)). This is formally stated in Proposition 3 and proved in this disclosure.

FIG. 4 is a conceptual diagram illustrating a normalized repair bandwidth (by per-node storage size) for multiple failures with e failed nodes, for an (n, 10,10) determinant code operating at mode m=3, i.e, (α, β, F)=(120,36,990).

Remark 2: Note that the repair bandwidth proposed for multiple repairs in Theorem 2 subsumes the one in Theorem 1 for single failure for setting e=1:

$\beta_{1}^{(m)} = {{\begin{pmatrix} d \\ m \end{pmatrix} - \begin{pmatrix} {d - 1} \\ m \end{pmatrix}} = {\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix} = {\beta^{(m)}.}}}$

Remark 3: It is worth mentioning that the repair-bandwidth proposed in Theorem 2 is universally and simultaneously achievable. That is, the same determinant code can simultaneously achieve β_(e) ^((m)) for every e∈{1, 2, . . . , n−d}.

The next theorem shows that the repair bandwidth for multiple failures can be further reduced in the centralized repair setting, by a sequential repair mechanism, and exploiting the repair symbols contributed by already repaired failed nodes which can act as helpers.

Theorem 3: In an (n, k=d, d) determinant code with (up to a scalar factor) parameters

${\alpha^{(m)} = {{\begin{pmatrix} d \\ m \end{pmatrix}\mspace{14mu}{and}\mspace{20mu} F^{(m)}} = {m\begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix}}}},$ any set of e simultaneously failed nodes can be centrally repaired by accessing an arbitrary set of d helper nodes and downloading a total of

$\begin{matrix} {{\overset{¯}{\beta}}_{e}^{(m)} = {\frac{1}{d}\left\lbrack {{m\ \begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix}} - {m\ \begin{pmatrix} {d - e + 1} \\ {m + 1} \end{pmatrix}}} \right\rbrack}} & \left( {3E} \right) \end{matrix}$

repair symbols from each helper node.

Remark 4: It is worth noting that for

${e > {d - m}},{{\overset{¯}{\beta}}_{e}^{(m)} = {{\frac{m}{d}\begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix}} = {F^{(m)}/{d\left( {{independent}\mspace{14mu}{of}\mspace{14mu} e} \right)}}}},{and}$ ${\frac{{\overset{¯}{\beta}}_{e}^{(m)}}{\alpha^{(m)}} = \frac{m\left( {d + 1} \right)}{d\left( {m + 1} \right)}},$

which is strictly less than 1 as shown in FIG. 4 (for all corner points except the MSR point, m=d). The fact that β _(e) ^((m))=F^((m))/d implies that the helper nodes contribute just enough number of repair symbols to be able to recover the entire file, without sending any redundant data. It is clear that this repair-bandwidth is optimum for e≥d, since such a set of e failed nodes may be able to recover the entire file after being repaired.

This theorem is built on the result of Theorem 2, by exploiting the repair data can be exchanged among the failed nodes. Note that in the centralized repair setting, the information exchanged among the failed nodes at the repair center are not counted against the repair bandwidth.

Note that for a given system parameter (n, k, d), a total of k triples of (α, β, F) can be obtained from (3), by changing the parameter μ. The following corollary shows that MBR and MSR points are subsumed as special points of the proposed trade-off.

Corollary 1: The code construction of this disclosure achieves the MBR point for μ=1, and the MSR point for μ=k.

Proof: For the MBR point, corresponding to μ=1,

$\begin{matrix} {{\alpha_{MBR}\overset{\Delta}{=}{{\alpha\left( {d,{k;1}} \right)} = {{\sum\limits_{m = 0}^{1}{\left( {d - k} \right)^{1 - m}\begin{pmatrix} k \\ m \end{pmatrix}}} = {{\left( {d - k} \right) + k} = d}}}},\mspace{20mu}{\beta_{MBR}\overset{\Delta}{=}{{\beta\left( {d,{k;\mu}} \right)} = {{\sum\limits_{m = 0}^{1}{\left( {d - k} \right)^{1 - m}\begin{pmatrix} {k - 1} \\ {m - 1} \end{pmatrix}}} = 1}}},{F_{MBR}\overset{\Delta}{=}{{F\left( {d,{k;\mu}} \right)} = {{\sum\limits_{m = 0}^{1}{{k\left( {d - k} \right)}^{1 - m}\begin{pmatrix} k \\ m \end{pmatrix}}} = {\begin{pmatrix} k \\ {1 + 1} \end{pmatrix} = {{{kd} - \begin{pmatrix} k \\ 2 \end{pmatrix}} = {\frac{k\left( {{2d} - k + 1} \right)}{2}.}}}}}}} & (4) \end{matrix}$

This triple satisfies

${\left( {\frac{\alpha_{MBR}}{F_{MBR}},\frac{\beta_{MBR}}{F_{MBR}}} \right) = \left( {\frac{2d}{k\left( {{2d} - k + 1} \right)},\frac{2}{k\left( {{2d} - k + 1} \right)}} \right)},$ which is the characteristic of the MBR point. Similarly, for μ=k

$\begin{matrix} {\mspace{79mu}{{\alpha_{MSR}\overset{\Delta}{=}{{\alpha\left( {d,{k;\mu}} \right)} = {{\sum\limits_{m = 0}^{k}{\left( {d - k} \right)^{k - m}\begin{pmatrix} k \\ m \end{pmatrix}}} = \left( {d - k + 1} \right)^{k}}}},{\beta_{MSR}\overset{\Delta}{=}{{\beta\left( {d,{k;\mu}} \right)} = {{\sum\limits_{m = 0}^{k}{\left( {d - k} \right)^{k - m}\begin{pmatrix} {k - 1} \\ {m - 1} \end{pmatrix}}} = \left( {d - k + 1} \right)^{k - 1}}}},{F_{MSR}\overset{\Delta}{=}{{F\left( {d,{k;\mu}} \right)} = {{\sum\limits_{m = 0}^{k}{{k\left( {d - k} \right)}^{k - m}\begin{pmatrix} k \\ m \end{pmatrix}}} = {\begin{pmatrix} k \\ {k + 1} \end{pmatrix} = {k\left( {d - k + 1} \right)}^{k}}}}},}} & (5) \end{matrix}$

which satisfy

${\left( {\frac{\alpha_{MSR}}{F_{MSR}},\frac{\beta_{MSR}}{F_{MSR}}} \right) = \left( {\frac{1}{k},\frac{1}{k\left( {d - k + 1} \right)}} \right)},$ which is the identity of the MSR point.

Corollary 2: The proposed code at mode μ=k−1 achieves the cut-set bound, and hence it is optimum.

Proof: The cut-set bound given by

$F \leq {\sum\limits_{i = 1}^{k}{\min\left( {\alpha,{\left( {d - i + 1} \right)\beta}} \right)}}$ reduces to F=(k−1)α+(d−k+1)β in the neighborhood of the MSR point. The latter equation is satisfied by the parameters of proposed code:

${{\left( {k - 1} \right){\alpha\left( {d,{k;{k - 1}}} \right)}} + {\left( {d - k + 1} \right){\beta\left( {d,{k;{k - 1}}} \right)}}} = {{{k\;{\alpha\left( {d,{k;{k - 1}}} \right)}} + {\left( {d - k} \right){\beta\left( {d,{k;{k - 1}}} \right)}} - \left\lbrack {{\alpha\left( {d,{k;{k - 1}}} \right)} - {\beta\left( {d,{k;{k - 1}}} \right)}} \right\rbrack} = {{{\sum\limits_{m = 0}^{k - 1}{{k\left( {d - k} \right)}^{k - 1 - m}\begin{pmatrix} k \\ m \end{pmatrix}}} + {\sum\limits_{m = 0}^{k - 1}{\left( {d - k} \right)^{k - m}\begin{pmatrix} {k - 1} \\ {m - 1} \end{pmatrix}}} - {\sum\limits_{m = 0}^{k - 1}{\left( {d - k} \right)^{k - 1 - m}\left\lbrack {\begin{pmatrix} k \\ m \end{pmatrix} - \begin{pmatrix} {k - 1} \\ {m - 1} \end{pmatrix}} \right\rbrack}}} = {{{\sum\limits_{m = 0}^{k - 1}{{k\left( {d - k} \right)}^{k - 1 - m}\begin{pmatrix} k \\ m \end{pmatrix}}} + {\sum\limits_{m = 0}^{k - 1}{\left( {d - k} \right)^{k - m}\begin{pmatrix} {k - 1} \\ {m - 1} \end{pmatrix}}} - {\sum\limits_{m = 0}^{k - 1}{\left( {d - k} \right)^{k - 1 - m}\begin{pmatrix} {k - 1} \\ m \end{pmatrix}}}} = {{{\sum\limits_{m = 0}^{k - 1}{{k\left( {d - k} \right)}^{k - 1 - m}\begin{pmatrix} k \\ m \end{pmatrix}}} + {\sum\limits_{m = 0}^{k - 1}{\left( {d - k} \right)^{k - m}\begin{pmatrix} {k - 1} \\ {m - 1} \end{pmatrix}}} - {\sum\limits_{m = 1}^{k}{\left( {d - k} \right)^{k - m}\begin{pmatrix} {k - 1} \\ {m - 1} \end{pmatrix}}}} = {{{\sum\limits_{m = 0}^{k - 1}{{k\left( {d - k} \right)}^{k - 1 - m}\begin{pmatrix} k \\ m \end{pmatrix}}} + {\left( {d - k} \right)^{k - 0}\begin{pmatrix} {k - 1} \\ {0 - 1} \end{pmatrix}} - {\left( {d - k} \right)^{k - k}\begin{pmatrix} {k - 1} \\ {k - 1} \end{pmatrix}}} = {{{\sum\limits_{m = 0}^{k - 1}{{k\left( {d - k} \right)}^{k - 1 - m}\begin{pmatrix} k \\ m \end{pmatrix}}} - 1} = {{F\left( {d,{k;{k - 1}}} \right)}.}}}}}}}$

Hence, this point satisfies the cut-set bound and it is optimum.

The code construction presented in this disclosure uses signed determinant codes as the main building blocks. The family of determinant codes is a class of codes that achieve the optimum (linear) storage-bandwidth tradeoff of the regenerating codes, when the number nodes participating in data recovery equals the number of helpers contributing to a repair process, i.e., k=d. They are linear codes, which can be constructed by multiplying an encoder matrix by a message matrix. The modification here (that converts a determinant code to a signed determinant code) is due arbitrary assignment of (+/−) signs to the rows of the message matrix, which affect all the entries in the corresponding row. The above modification preserves all properties of determinant codes, while it is helpful towards the next step which is the construction of (n, k, d) codes.

The following reviews the construction of signed determinant codes and their properties. The family of signed determinant codes for an (n, k=d, d) system consists of d distinct codes, enumerated by a parameter m∈{1, 2, . . . , d}, which is called mode of the code. For any mode m∈[d], the parameters of the determinant code corresponding to the m-th corner point on the trade-off are given by

$\left( {\alpha_{m},\beta_{m},F_{m}} \right) = {\left( \ {\begin{pmatrix} d \\ m \end{pmatrix},\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix},{m\ \begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix}}} \right).}$

Here m=1 corresponds to MBR code, while m=d results in the parameters of an MSR code. For a distributed storage system with parameters (n, k=d, d) and corresponding to a mode m∈{1, 2, . . . , d}, the construction provides an exact-repair regenerating code with per-node storage capacity

$\alpha^{(m)} = \begin{pmatrix} d \\ m \end{pmatrix}$ and per-node repair-bandwidth

$\beta^{(m)} = {\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}.}$ This code can store up to

$F^{(m)} = {m\begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix}}$ symbols.

The coded symbols in a matrix is represented by

_(n×a), in which the i-th row corresponds to the encoded data to be stored in i-th node of DSS. The proposed code is linear, i.e., the encoded matrix

is obtained by multiplying an encoder matrix Ψ_(n×d) and a message matrix. All entries of the encoder matrix and the message matrix are assumed to be from a finite field

, which has at least n distinct elements. Moreover, all the arithmetic operations are performed with respect to the underlying finite field. The structures of the encoder and message matrices are given below.

A signed determinant code with parameters (n, k, d) and mode m is represented by a matrix C_(n×α) _(m) whose i-th row includes the coded content of the i-th node. In general, C_(n×α) _(m) is obtained by multiplying an encoder matrix Ψ_(n×d) whose entries are from a finite field

_(q) and a message matrix D_(d×α) _(m) . The encoder matrix Ψ is chosen such that any collection of d of its rows is linearly independent. Examples of such matrices include Vandermonde and Cauchy matrices.

Encoder Matrix: The matrix Ψ_(n×d) is a fixed matrix which is shared among all the nodes in the system. The main property required for matrix Ψ is being Maximum-Distance-Separable (MDS), that is, any d×d sub-matrix of Ψ_(n×d) is full-rank. Examples of MDS matrices include Vandermonde or Cauchy matrices. An MDS matrix may be converted to a systematic MDS matrix, by multiplying it by the inverse of its top d×d sub-matrix. The first k nodes may be referred to by systematic nodes if a systematic MDS matrix is used for encoding.

Message Matrix: The message matrix D is filled with raw (source) symbols and parity symbols. Recall that D is a d×α matrix, that has

${d\alpha} = {d\begin{pmatrix} d \\ m \end{pmatrix}}$ entries, while storing only

$F = {m\begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix}}$ source symbols. Hence, there are

${{d\;\alpha} - F} = \begin{pmatrix} d \\ {m + 1} \end{pmatrix}$ redundant entries in D, which are filled with parity symbols. More precisely, the techniques described herein divide the set of F data symbols into two groups, namely,

and

, whose elements are indexed by sets as follows

$\begin{matrix} {{V = \left\{ {{{v_{x,\mathcal{X}}\text{:}\mathcal{X}} \subseteq \lbrack d\rbrack},{{❘\mathcal{X}❘} = m},{x \in \mathcal{X}}} \right\}},{W = {\left\{ {{{w_{x,\mathcal{Y}}\text{:}\mathcal{Y}} \subseteq \lbrack d\rbrack},{{❘\mathcal{Y}❘} = {m + 1}},{x \in \mathcal{Y}},{{{in}{d_{\mathcal{Y}}(x)}} \leq m}} \right\}.}}} & (6) \end{matrix}$

Note that each element of

is indexed by a set

⊆[d] of length |

|=m and an integer number x∈

. Hence,

${V} = {{m\begin{pmatrix} d \\ m \end{pmatrix}}.}$ Similarly, symbols in

are indexed by a pair (x,

), where

is a subset of [d] with m+1 entries, and x can take any value in

except the largest one. So, there are

${W} = {m\begin{pmatrix} d \\ {m + 1} \end{pmatrix}}$ symbols in set

. Note that F=|

|+|

|.

${{V} + {W}} = {{{m\begin{pmatrix} d \\ m \end{pmatrix}} + {m\begin{pmatrix} d \\ {m + 1} \end{pmatrix}}} = {{m\begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix}} = {F_{m}.}}}$

Moreover, for (x,

) with

(x)=m+1, compute a parity symbol

, so that the parity equation

$\begin{matrix} {{\sum\limits_{y \in \mathcal{Y}}{\left( {- 1} \right)^{{ind}_{\mathcal{Y}}(y)}w_{y,\mathcal{Y}}}} = 0} & (7) \end{matrix}$

hold for any

⊆[d] with |

|=m+1. In other words, such missing symbols are given by

$\begin{matrix} {{\left( {- 1} \right)^{m + 1}w_{{\max\mathcal{J}},\mathcal{J}}} = {- {\sum\limits_{y \in {\mathcal{J}\backslash{\{{\max\mathcal{J}}\}}}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}}(y)}{w_{y,\mathcal{J}}.}}}}} &  \end{matrix}$

Finally, for a arbitrary given signature vector σ_(D): [d]→

, a plus or minus sign may be assigned to each integer x∈[d], that is, (−1)^(σ) ^(D) ^((x)). To fill the data matrix D, label its rows by integer numbers from [d] and its columns by subsets

⊆[d] with |

|=m, according to the lexicographical order. Then the entry at row x and column

is given by

$\begin{matrix} {D_{x,\mathcal{J}} = \left\{ \begin{matrix} {\left( {- 1} \right)^{\sigma_{D}{(x)}}v_{x,\mathcal{J}}} & {{{{if}\mspace{14mu} x} \in \mathcal{J}},} \\ {\left( {- 1} \right)^{\sigma_{D}{(x)}}w_{x,{\mathcal{J}\bigcup{\{ x\}}}}} & {{{if}\mspace{14mu} x} \notin {\mathcal{J}.}} \end{matrix} \right.} & \left( {8A} \right) \end{matrix}$

For the sake of completeness, define an (n, k=d, d; m=0) determinant code at mode m=0 to be a trivial code with (α=1, β=0, F=0), whose message matrix is a d×1 all-zero matrix.

The second important property of the proposed code is its ability to exactly repair the content of a failed node using the repair data sent by the helper nodes. Let node f∈[n] fails, and a set of helper nodes

⊆{1, 2, . . . , n}\{f} with |

|=d wishes to repair node f. The techniques described herein first determine the repair data sent from each helper node in order to repair node f.

Repair Encoder Matrix at the Helper Nodes: For a determinant code operating in mode m and a failed node f, the repair-encoder matrix Ξ^(f,(m)) is defined as a

$\begin{pmatrix} d \\ m \end{pmatrix} \times \begin{pmatrix} d \\ {m - 1} \end{pmatrix}$ matrix, whose rows are labeled by m-element subsets of [d] and columns are labeled by (m−1)-element subsets of [d]. The entry in row

and column

is given by

$\begin{matrix} {= \left\{ \begin{matrix}  & {{{{{if}\mspace{14mu}}\bigcup\left\{ x \right\}} =},} \\ 0 & {{otherwise},} \end{matrix} \right.} & \left( {8B} \right) \end{matrix}$

where ψ_(f,x) is the entry of the encoder matrix Ψ at position (f, x). An example of the matrix Ξ is given in (29).

In order to repair node f, each helper node h ∈

multiplies its content Ψ_(h)·D by the repair-encoder matrix of node f to obtain Ψ_(h)·D·Ξ^(f,(m)), and sends it to node f. Note that matrix Ξ^(f,(m)) has

$\quad\begin{pmatrix} d \\ {m - 1} \end{pmatrix}$ columns, and hence the length of the repair data Ψ_(h)·D·Ξ^(f,(m)) is

$\quad{\begin{pmatrix} d \\ {m - 1} \end{pmatrix},}$ which is greater than

$\beta = {\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}.}$ However, the following proposition states that out of

$\quad\begin{pmatrix} d \\ {m - 1} \end{pmatrix}$ columns of matrix Ξ^(f,(m)) at most

$\beta^{(m)} = \begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}$ are linearly independent. Thus, the entire vector Ψ_(h)·D·Ξ^(f,(m)) can be sent by communicating at most β symbols (corresponding to the linearly independent columns of Ξ^(f,(m))) to the failed node, and other symbols can be reconstructed using the linear dependencies among the repair symbols. This is formally stated in the following proposition, which is proved in this disclosure.

Proposition 1: The rank of matrix Ξ^(f,(m)) is at most

$\beta^{(m)} = {\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}.}$

Decoding at the Failed Node: Upon receiving d repair-data vectors {Ψ_(h)·D·Ξ^(f,(m)): h∈

}, the failed node stacks them to form a matrix Ψ[

, :]·D·Ξ^(f,(m)), where Ψ[

, :] in the sub-matrix of Ψ obtained from nodes h∈

. This matrix is full-rank by the definition of the Ψ matrix. Multiplying by Ψ[

, :]⁻¹, the failed node retrieves R ^(f,(m)) =D·Ξ ^(f,(m))  (8C)

This is a

$d \times \begin{pmatrix} d \\ {m - 1} \end{pmatrix}$ matrix. These

$d\begin{pmatrix} d \\ {m - 1} \end{pmatrix}$ linear combinations of the data symbols span a linear subspace, which is referred to by repair space of node f. The following proposition shows that all of the missing symbols of node f can be recovered from its repair space.

Proposition 2: In the (n, k=d, d) proposed codes with parameters

${\left( {\alpha^{(m)},\beta^{(m)},F^{(m)}} \right) = \left( \ {\begin{pmatrix} d \\ m \end{pmatrix},\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix},{m\ \begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix}}} \right)},$ for every failed node f ∈ [n] and set of helpers

⊆[n]\{f} with |H|=d, the content of node f can be exactly regenerated by downloading β symbols from each of nodes in

. More precisely, the

-th entry of the node f can be recovered using

$\begin{matrix} {\left\lbrack {\Psi_{f} \cdot D} \right\rbrack_{\mathcal{J}}{\sum\limits_{x \in \mathcal{J}}{{\left( {- 1} \right)^{{ind}_{\mathcal{J}}(x)}\left\lbrack R^{f,{(m)}} \right\rbrack}_{x,{\mathcal{J} \smallsetminus {\{ x\}}}}.}}} & \left( {8D} \right) \end{matrix}$

Remark 1: Note that for a code defined on the Galois field GF(2^(S)) with characteristic 2, −1=+1, and hence, all the positive and negative signs disappear. In particular, the parity equation in (5) may simply reduce to

${\sum\limits_{y \in \mathcal{J}}w_{y,\mathcal{J}}} = 0.$

the non-zero entries of the repair encoder matrix in (7) may be ψ_(f,x), and the repair equation in (9) may be replaced by

$\left\lbrack {\Psi_{f} \cdot D} \right\rbrack_{\mathcal{J}}{\sum\limits_{x \in \mathcal{J}}{\left\lbrack R^{f,{(m)}} \right\rbrack_{x,{\mathcal{J} \smallsetminus {\{ x\}}}}.}}$

The repair mechanism proposed for multiple failure scenario is similar to that of the single failure case. The techniques described herein consider a set of failed nodes

with e=|

| failures. Each helper node h∈

sends its repair data to all failed nodes simultaneously. Each failed node f∈

can recover the repair data {Ψ_(h)·D·Ξ^(f,(m)):h∈

}, and the repair mechanism is similar to that explained in Proposition 2.

A naive approach is to simply concatenate all the required repair data {Ψ_(h)·D·Ξ^(f,(m)):f∈

} at the helper node h∈

and send it to the failed nodes. More precisely, for a set of failed nodes

={f₁, f₂, . . . , f_(e)} and a helper node h∈

, define its repair data as

Ψ_(h) ⋅ D ⋅ Ξ^(ε, (m)),

where

$\begin{matrix} {\Xi^{\varepsilon,{(m)}} = {\begin{bmatrix} \Xi^{f_{1},{(m)}} & \Xi^{f_{2},{(m)}} & \ldots & \Xi^{f_{e},{(m)}} \end{bmatrix}.}} & \left( {8E} \right) \end{matrix}$

This is simply a concatenation of the repair data for individual repair of f∈

, and the content of each failed node can be exactly reconstructed according to Proposition 2. The repair bandwidth required for naive concatenation scheme is

${e \times \beta_{1}^{(m)}} = {{e\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}}.}$ Instead, the techniques described herein show that the bandwidth can be opportunistically utilized by exploiting the intersection between the repair space of the different failed nodes. The following proposition shows that the repair data

Ψ h · D · ℰ , ( m )

can be delivered to the failed nodes by communicating only β_(e) ^((m)) repair symbols.

Proposition 3: Assume that a family of e nodes

={f₁, f₂, . . . , f_(e)} are failed. Then the rank of matrix

defined in (10) is at most

$\begin{pmatrix} d \\ m \end{pmatrix} - {\begin{pmatrix} {d - e} \\ m \end{pmatrix}.}$

Before presenting the formal proof of the main properties of the proposed code, the techniques described herein show the code construction and the repair mechanism through an example in this section. This example is similar to that of, and may be helpful to understand the notation and the details of the code construction, as well as to provide an intuitive justification for its underlying properties.

Let's consider a distributed storage system with parameters (n, k, d)=(8,4,4) and an operating mode m=2. The parameters of the proposed regeneration code for this point of the trade-off are given by

$\left( {\alpha^{(2)},\beta^{(2)},F^{(2)}} \right) = {\left( {\begin{pmatrix} 4 \\ 2 \end{pmatrix},\begin{pmatrix} {4 - 1} \\ {2 - 1} \end{pmatrix},{2\begin{pmatrix} {4 + 1} \\ {2 + 1} \end{pmatrix}}} \right) = {\left( {6,3,20} \right).}}$

The techniques described herein first label and partition the information symbols into two groups,

and

, with

${V} = {{m\begin{pmatrix} d \\ m \end{pmatrix}} = {{2\begin{pmatrix} 4 \\ 2 \end{pmatrix}} = {12\mspace{14mu}{and}}}}$ ${W} = {{m\ \begin{pmatrix} d \\ {m + 1} \end{pmatrix}} = {{2\begin{pmatrix} 4 \\ 3 \end{pmatrix}} = 8.}}$ Note that |

|+|

|=20=F.

${V = \begin{Bmatrix} {v_{1,{\{{1,2}\}}},v_{2,{\{{1,2}\}}},v_{1,{\{{1,3}\}}},v_{3,{\{{1,3}\}}},} \\ {v_{1,{\{{1,4}\}}},v_{4,{\{{1,4}\}}},v_{2,{\{{2,3}\}}},v_{3,{\{{2,3}\}}},} \\ {v_{2,{\{{2,3}\}}},v_{4,{\{{2,4}\}}},v_{3,{\{{3,4}\}}},v_{4,{\{{3,4}\}}}} \end{Bmatrix}},{W = {\begin{Bmatrix} {w_{1,{\{{1,2,3}\}}},w_{2,{\{{1,2,3}\}}},w_{1,{\{{1,2,4}\}}},w_{2,{\{{1,2,4}\}}},} \\ {w_{1,{\{{1,3,4}\}}},w_{3,{\{{1,3,4}\}}},w_{2,{\{{2,3,4}\}}},w_{3,{\{{2,3,4}\}}}} \end{Bmatrix}.}}$

Moreover, for each subset

⊆[4] with |

|=m+1=3, define parity symbols as

$\begin{matrix} \left\{ \begin{matrix} {{= {{\left\{ {1,2,3} \right\}\text{:}\mspace{11mu} w_{3,{\{{1,2,3}\}}}} = {w_{2,{\{{1,2,3}\}}} - w_{1,{\{{1,2,3}\}}}}}},} \\ {{= {{\left\{ {1,2,4} \right\}\text{:}\mspace{11mu} w_{4,{\{{1,2,4}\}}}} = {w_{2,{\{{1,2,4}\}}} - w_{1,{\{{1,2,4}\}}}}}},} \\ {{= {{\left\{ {1,3,4} \right\}\text{:}\mspace{11mu} w_{4,{\{{1,3,4}\}}}} = {w_{3,{\{{1,3,4}\}}} - w_{1,{\{{1,3,4}\}}}}}},} \\ {= {{\left\{ {2,3,4} \right\}\text{:}\mspace{11mu} w_{4,{\{{2,3,4}\}}}} = {w_{3,{\{{2,3,4}\}}} - {w_{2,{\{{2,3,4}\}}}.}}}} \end{matrix} \right. & \left( {8F} \right) \end{matrix}$

Next, the message matrix D may be formed by placing v and w symbols as specified in (6). The resulting message matrix is given by

The next step for encoding the data is multiplying D by an encoder matrix Ψ. To this end, choose a finite field

₁₃ (with at least n=8 distinct non-zero entries), and pick an 8×4 Vandermonde matrix generated by i=1, 2, 3, 4, 5, 6, 7, 8. The techniques described herein convert this matrix to a systematic MDS matrix by multiplying it from the right by the inverse of its top 4×4 matrix. That is,

$\begin{matrix} {\Psi_{8 \times 4} = \begin{bmatrix} \Psi_{1} \\ \Psi_{2} \\ \Psi_{3} \\ \Psi_{4} \\ \Psi_{5} \\ \Psi_{6} \\ \Psi_{7} \\ \Psi_{8} \end{bmatrix}} \\ {= {\begin{bmatrix} 1^{0} & 1^{1} & 1^{2} & 1^{3} \\ 2^{0} & 2^{1} & 2^{2} & 2^{3} \\ 3^{0} & 3^{1} & 3^{2} & 3^{3} \\ 4^{0} & 4^{1} & 4^{2} & 4^{3} \\ 5^{0} & 5^{1} & 5^{2} & 5^{3} \\ 6^{0} & 6^{1} & 6^{2} & 6^{3} \\ 7^{0} & 7^{1} & 7^{2} & 7^{3} \\ 8^{0} & 8^{1} & 8^{2} & 8^{3} \end{bmatrix} \cdot}} \\ {\begin{bmatrix} 1^{0} & 1^{1} & 1^{2} & 1^{3} \\ 2^{0} & 2^{1} & 2^{2} & 2^{3} \\ 3^{0} & 3^{1} & 3^{2} & 3^{3} \\ 4^{0} & 4^{1} & 4^{2} & 4^{3} \end{bmatrix}^{- 1}} \\ {= {\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 12 & 4 & 7 & 4 \\ 9 & 2 & 6 & 10 \\ 3 & 10 & 7 & 7 \\ 6 & 5 & 7 & 9 \end{bmatrix}{\left( {{mod}\mspace{14mu} 13} \right).}}} \end{matrix}$

Note that every k=4 rows of matrix Ψ are linearly independent, and form an invertible matrix. Then the content of node i is formed by row i in the matrix product Ψ·D, which are denoted by Ψ_(i)·D.

Data recovery from the content of any k=4 node is immediately implied by the MDS property of the encoder matrix. Next, the repair process for single and multiple failures is described.

Remark 1: Note that the construction of signed determinant codes decouples the parameters of the code. The encoder matrix only depends on n and d and remains the same for all modes. On the other hand, the message matrix D is fully determined by parameters (d, m), and does not depend on n, the total number of nodes in the system. Thus, the techniques described herein refer to the code defined above as a (d; m) signed determinant code and to matrix D as a (d; m) message matrix.

$\begin{matrix} {R^{f,{(2)}}\begin{matrix} \begin{matrix} \begin{matrix} 1 \\ 2 \end{matrix} \\ 3 \end{matrix} \\ 4 \end{matrix}\overset{\{ 1\}}{\left\lbrack \left. \begin{matrix} \begin{matrix} \begin{matrix} {{\upsilon_{1,{\{{1,2}\}}}\psi_{f,2}} + {\upsilon_{1,{\{{1,3}\}}}\psi_{f,3}} + {\upsilon_{1,{\{{1,4}\}}}\psi_{f,4}}} \\ {{\upsilon_{2,{\{{1,2}\}}}\psi_{f,2}} + {w_{2,{\{{1,2,3}\}}}\psi_{f,3}} + {w_{1,{\{{1,2,4}\}}}\psi_{f,4}}} \end{matrix} \\ {{w_{3,{\{{1,2,3}\}}}\psi_{f,2}} + {\upsilon_{3,{\{{1,3}\}}}\psi_{f,3}} + {w_{3,{\{{1,3,4}\}}}\psi_{f,4}}} \end{matrix} \\ {{w_{4,{\{{1,2,4}\}}}\psi_{f,2}} + {w_{4,{\{{1,3,4}\}}}\psi_{f,3}} + {\upsilon_{4,{\{{1,4}\}}}\psi_{f,4}}} \end{matrix} \right| \right.}\overset{\{ 2\}}{\begin{matrix} {{{- \upsilon_{1,{\{{1,2}\}}}}\psi_{f,1}} + {w_{1,{\{{1,2,3}\}}}\psi_{f,3}} + {w_{1,{\{{1,2,4}\}}}\psi_{f,4}}} & \ldots \\ {{{- \upsilon_{2,{\{{1,2}\}}}}\psi_{f,1}} + {\upsilon_{2,{\{{2,3}\}}}\psi_{f,3}} + {\upsilon_{2,{\{{2,4}\}}}\psi_{f,4}}} & \ldots \\ {{{- w_{3,{\{{1,2,3}\}}}}\psi_{f,1}} + {\upsilon_{3,{\{{2,3}\}}}\psi_{f,3}} + {w_{3,{\{{2,3,4}\}}}\psi_{f,4}}} & \ldots \\ {{{- w_{4,{\{{1,2,4}\}}}}\psi_{f,1}} + {w_{4,{\{{2,3,4}\}}}\psi_{f,3}} + {\upsilon_{4,{\{{2,4}\}}}\psi_{f,4}}} & \ldots \end{matrix}}} \\ {\overset{\{ 3\}}{\left. \begin{matrix} \begin{matrix} \begin{matrix} {{{- \upsilon_{1,{\{{1,3}\}}}}\psi_{f,1}} - {w_{1,{\{{1,2,3}\}}}\psi_{f,2}} + {w_{1,{\{{1,3,4}\}}}\psi_{f,4}}} \\ {{{- w_{2,{\{{1,2,3}\}}}}\psi_{f,1}} - {\upsilon_{2,{\{{2,3}\}}}\psi_{f,2}} + {w_{2,{\{{2,3,4}\}}}\psi_{f,4}}} \end{matrix} \\ {{{- \upsilon_{3,{\{{1,3}\}}}}\psi_{f,1}} - {\upsilon_{3,{\{{2,3}\}}}\psi_{f,2}} + {\upsilon_{3,{\{{3,4}\}}}\psi_{f,4}}} \end{matrix} \\ {{{- w_{4,{\{{1,3,4}\}}}}\psi_{f,1}} - {w_{4,{\{{2,3,4}\}}}\psi_{f,2}} + {\upsilon_{4,{\{{3,4}\}}}\psi_{f,4}}} \end{matrix} \right|}\overset{\{ 4\}}{\left. \begin{matrix} {{{- \upsilon_{1,{\{{1,4}\}}}}\psi_{f,1}} - {w_{1,{\{{1,2,4}\}}}\psi_{f,2}} - {w_{1,{\{{1,3,4}\}}}\psi_{f,3}}} \\ {{{- w_{2,{\{{1,2,4}\}}}}\psi_{f,1}} - {\upsilon_{2,{\{{2,4}\}}}\psi_{f,2}} - {w_{2,{\{{2,3,4}\}}}\psi_{f,3}}} \\ {{{- w_{3,{\{{1,3,4}\}}}}\psi_{f,1}} - {w_{3,{\{{2,3,4}\}}}\psi_{f,2}} - {\upsilon_{3,{\{{3,4}\}}}\psi_{f,3}}} \\ {{{- \upsilon_{4,{\{{1,4}\}}}}\psi_{f,1}} - {\upsilon_{4,{\{{2,4}\}}}\psi_{f,2}} - {\upsilon_{4,{\{{3,4}\}}}\psi_{f,3}}} \end{matrix} \right\rbrack}} \end{matrix}$

First, suppose that a non-systematic node f fails, and the techniques described herein wish to repair it by the help of the systematic nodes

={1,2,3,4}, by downloading β=3 from each. The content of node f is given by Ψ_(f)·D, which includes α=6 symbols. Note that the content of this node is a row vector whose elements has the same labeling as the columns of D, i.e all m=2 elements subsets of [d]={1,2,3,4}. The symbols of this node are given by:

$\begin{matrix} \left\{ \begin{matrix} {= {\left\{ {1,2} \right\}\text{:}}} \\ {{{\psi_{f,1}v_{1,{\{{1,2}\}}}} + {\psi_{f,2}v_{2,{\{{1,2}\}}}} + {\psi_{f,3}w_{3,{\{{1,2,3}\}}}} + {\psi_{f,4}w_{4,{\{{1,2,4}\}}}}},} \\ {= {\left\{ {1,3} \right\}\text{:}}} \\ {{{\psi_{f,1}v_{1,{\{{1,3}\}}}} + {\psi_{f,2}w_{2,{\{{1,2,3}\}}}} + {\psi_{f,3}w_{3,{\{{1,3}\}}}} + {\psi_{f,4}w_{4,{\{{1,3,4}\}}}}},} \\ {= {\left\{ {1,4} \right\}\text{:}}} \\ {{{\psi_{f,1}v_{1,{\{{1,4}\}}}} + {\psi_{f,2}w_{2,{\{{1,2,4}\}}}} + {\psi_{f,3}w_{3,{\{{1,3,4}\}}}} + {\psi_{f,4}v_{4,{\{{1,4}\}}}}},} \\ {= {\left\{ {2,3} \right\}\text{:}}} \\ {{{\psi_{f,1}w_{1,{\{{1,2,3}\}}}} + {\psi_{f,2}v_{2,{\{{2,3}\}}}} + {\psi_{f,3}v_{3,{\{{2,3}\}}}} + {\psi_{f,4}w_{4,{\{{2,3,4}\}}}}},} \\ {= {\left\{ {2,4} \right\}\text{:}}} \\ {{{\psi_{f,1}w_{1,{\{{1,2,4}\}}}} + {\psi_{f,2}v_{2,{\{{2,4}\}}}} + {\psi_{f,3}w_{3,{\{{2,3,4}\}}}} + {\psi_{f,4}v_{4,{\{{2,4}\}}}}},} \\ {= {\left\{ {3,4} \right\}\text{:}}} \\ {{\psi_{f,1}w_{1,{\{{1,3,4}\}}}} + {\psi_{f,2}w_{2,{\{{2,3,4}\}}}} + {\psi_{f,3}v_{3,{\{{3,4}\}}}} + {\psi_{f,4}{v_{4,{\{{3,4}\}}}.}}} \end{matrix} \right. & \left( {8G} \right) \end{matrix}$

In the repair procedure using the systematic nodes as helpers, every symbol may be repaired by m nodes. Recall that d helper nodes contribute in the repair process by sending

$\beta = \begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}$ symbols each, in order to repair

$\alpha = \begin{pmatrix} d \\ m \end{pmatrix}$ missing symbols. Hence, the number of repair equations per missing symbol is dβ/α=m, which matches with the proposed repair mechanism.

The m=2 helpers for each missing encoded symbol are those who have a copy of the corresponding v-symbols, e.g., for the symbol indexed by

={1,2} which has v_(1,{1,2}) and v_(2,{1,2}), the contributing helpers are nodes 1 (who has a copy of v_(1,{1,2})) and node 2 (who stores a copy of v_(2,{1,2})). To this end, node 1 can send ψ_(f,1)v_(1,{1,2}) which node 2 sends ψ_(f,2)v_(2,{1,2}) to perform the repair.

It can be seen that the {1,2}-th missing symbols has also two other terms depending on w_(3,{1,2,3}) and w_(4,{1,2,4}), which are stored at nodes 3 and 4, respectively. A naive repair mechanism requires these two nodes also to contribute in this repair procedure, which yields in a full data recovery in order to repair a failed node. Alternatively, the techniques described herein can reconstruct these w-symbols using the parity equations, and the content of the the first two helper nodes. Recall from (5) that w _(3,{1,2,3}) =−w _(1,{1,2,3}) +w _(2,{1,2,3}), w _(4,{1,2,4}) =−w _(1,{1,2,4}) +w _(2,{1,2,4}),

where w_(1,{1,2,3}) and w_(1,{1,2,4}) are stored in node 1 and w_(2,{1,2,3}) and w_(2,{1,2,4}) are stored in node 2. Hence, the content of nodes 1 and 2 are sufficient to reconstruct the {1,2}-th symbol at the failed node f. To this end, node 1 computes A=ψ_(f,1)v_(1,{1,2})−ψ_(f,3)w_(1,{1,2,3})−ψ_(f,4)w_(1,{1,2,4}) (a linear combination of its first, forth, and fifth entries), and sends A to f. Similarly, node 2 sends B=ψ_(f,2)v_(2,{1,2})+ψ_(f,3)w_(2,{1,2,3})+ψ_(f,4)w_(2,{1,2,4}) (a linear combination of its first, second, and third coded symbols). Upon receiving these symbols, the {1,2}-th missing symbols of node f can be recovered from

$\begin{matrix} \begin{matrix} {{A + B} = {\left( {{\psi_{f,1}v_{1,{\{{1,2}\}}}} - {\psi_{f,3}w_{1,{\{{1,2,3}\}}}} - {\psi_{f,4}w_{1,{\{{1,2,4}\}}}}} \right) +}} \\ {\left( {{\psi_{f,2}v_{2,{\{{1,2}\}}}} + {\psi_{f,3}w_{2,{\{{1,2,3}\}}}} + {\psi_{f,4}w_{2,{\{{1,2,4}\}}}}} \right)} \\ {= {{\psi_{f,1}v_{1,{({1,2}\}}}} + {\psi_{f,2}v_{2,{\{{1,2}\}}}} +}} \\ {{\psi_{f,3}\left( {w_{2,{({1,2,3}\}}} - w_{1,{\{{1,2,3}\}}}} \right)} +} \\ {\psi_{f,4}\left( {w_{2,{({1,2,4}\}}} - w_{1,{\{{1,2,4}\}}}} \right)} \\ {= {{\psi_{f,1}v_{1,{({1,2}\}}}} + {\psi_{f,2}v_{2,{\{{1,2}\}}}} +}} \\ {{\psi_{f,3}w_{3,{({1,2,3}\}}}} + {\psi_{f,4}{w_{4,{\{{1,2,4}\}}}.}}} \end{matrix} & \left( {8H} \right) \end{matrix}$

In general, v symbols are repaired directly by communicating an identical copy of them, while w symbols are repaired indirectly, using their parity equations. This is the general rule that the techniques described herein use for repair of all other missing symbols of node f. It can be seen that each helper node participates in the repair of β=3 missing symbols, by sending one repair symbol for each. For instance, node 1 contributes in the repair of symbols indexed by {1,2}, {1,3}, and {1,4}. The repair equation sent by node 1 for each these repair scenarios are listed below:

Repair Symbols Sent by Node 1:

$\begin{matrix} \left\{ \begin{matrix} {{\mathcal{J} = {{\left\{ {1,2} \right\}\text{:}\psi_{f,1}v_{1,{\{{1,2}\}}}} - {\psi_{f,3}w_{1,{\{{1,2,3}\}}}} - {\psi_{f,4}w_{1,{\{{1,2,4}\}}}}}},} \\ {{\mathcal{J} = {{\left\{ {1,3} \right\}\text{:}\psi_{f,1}v_{1,{\{{1,3}\}}}} + {\psi_{f,2}w_{1,{\{{1,2,3}\}}}} - {\psi_{f,4}w_{1,{\{{1,3,4}\}}}}}},} \\ {\mathcal{J} = {{\left\{ {1,4} \right\}\text{:}\psi_{f,1}v_{1,{\{{1,4}\}}}} + {\psi_{f,2}w_{1,{\{{1,2,4}\}}}} + {\psi_{f,3}{w_{1,{\{{1,3,4}\}}}.}}}} \end{matrix} \right. & (81) \end{matrix}$

Similarly, the repair symbols sent from helper nodes 2, 3, and 4 are given by

Repair Symbols Sent by Node 2:

$\begin{matrix} \left\{ \begin{matrix} {{= {{\left\{ {1,2} \right\}\text{:}\mspace{14mu}\psi_{f,2}v_{2,{\{{1,2}\}}}} + {\psi_{f,3}v_{2,{\{{1,2,3}\}}}} + {\psi_{f,4}w_{2,{\{{1,2,4}\}}}}}},} \\ {{= {{\left\{ {2,3} \right\}\text{:}\mspace{14mu}\psi_{f,1}w_{2,{\{{1,2,3}\}}}} + {\psi_{f,2}v_{2,{\{{2,3}\}}}} - {\psi_{f,4}w_{2,{\{{2,3,4}\}}}}}},} \\ {{= {{\left\{ {2,4} \right\}\text{:}\mspace{14mu}\psi_{f,1}w_{2,{\{{1,2,4}\}}}} + {\psi_{f,2}v_{2,{\{{2,4}\}}}} + {\psi_{f,3}w_{2,{\{{2,3,4}\}}}}}},} \end{matrix} \right. & \left( {8J} \right) \end{matrix}$

Repair Symbols Sent by Node 3:

$\begin{matrix} \left\{ \begin{matrix} {{= {{\left\{ {1,3} \right\}\text{:}\mspace{14mu}\psi_{f,2}w_{3,{\{{1,2,3}\}}}} + {\psi_{f,3}v_{3,{\{{1,3}\}}}} + {\psi_{f,4}w_{3,{\{{1,3,4}\}}}}}},} \\ {{= {{\left\{ {2,3} \right\}\text{:}}\mspace{14mu} - {\psi_{f,1}w_{3,{\{{1,2,3}\}}}} + {\psi_{f,3}v_{3,{\{{2,3}\}}}} + {\psi_{f,4}w_{3,{\{{2,3,4}\}}}}}},} \\ {{= {{\left\{ {3,4} \right\}\text{:}\mspace{14mu}\psi_{f,1}w_{3,{\{{1,3,4}\}}}} + {\psi_{f,2}w_{3,{\{{2,3,4}\}}}} + {\psi_{f,3}v_{3,{\{{3,4}\}}}}}},} \end{matrix} \right. & \left( {8K} \right) \end{matrix}$

Repair Symbols Sent by Node 4:

$\begin{matrix} \left\{ \begin{matrix} {{= {{\left\{ {1,4} \right\}\text{:}\mspace{14mu}\psi_{f,2}w_{4,{\{{1,2,4}\}}}} + {\psi_{f,3}w_{4,{\{{1,3,4}\}}}} + {\psi_{f,4}v_{4,{\{{1,4}\}}}}}},} \\ {{= {{\left\{ {2,4} \right\}\text{:}}\mspace{14mu} - {\psi_{f,1}w_{4,{\{{1,2,4}\}}}} + {\psi_{f,3}w_{4,{\{{2,3,4}\}}}} + {\psi_{f,4}v_{4,{\{{2,4}\}}}}}},} \\ {= {{\left\{ {3,4} \right\}\text{:}}\mspace{14mu} - {\psi_{f,1}w_{4,{\{{1,3,4}\}}}} - {\psi_{f,2}w_{4,{\{{2,3,4}\}}}} + {\psi_{f,4}{v_{4,{\{{3,4}\}}}.}}}} \end{matrix} \right. & \left( {8L} \right) \end{matrix}$

The repair symbols of helper node h∈{1,2,3,4} in (25)-(28) could be obtain from Ψ_(h)·D·Ξ^(f,(2)), which is the content of the helper nodes (i.e., Ψ_(h)·D) times the repair encoder matrix for m=2 (i.e., Ξ^(f,(2))) defined as:

$\Xi^{f,{(2)}} = {\begin{matrix} \begin{matrix} \begin{matrix} \begin{matrix} \begin{matrix} \; \\ \left\{ {1,2} \right\} \end{matrix} \\ \left\{ {1,3} \right\} \end{matrix} \\ \left\{ {1,4} \right\} \end{matrix} \\ \left\{ {2,3} \right\} \end{matrix} \\ \begin{matrix} \left\{ {2,4} \right\} \\ \left\{ {3,4} \right\} \end{matrix} \end{matrix}\begin{matrix} \begin{matrix} {\left\{ 1 \right\}\mspace{25mu}} & {\left\{ 2 \right\}\mspace{31mu}} & \left\{ 3 \right\} & {\mspace{20mu}\left\{ 4 \right\}} \end{matrix} \\ \begin{bmatrix} \psi_{f,2} & {- \psi_{f,1}} & 0 & 0 \\ \psi_{f,3} & 0 & {- \psi_{f,1}} & 0 \\ \psi_{f,4} & 0 & 0 & {- \psi_{f,1}} \\ 0 & \psi_{f,3} & {- \psi_{f,2}} & 0 \\ 0 & \psi_{f,4} & 0 & {- \psi_{f,2}} \\ 0 & 0 & \psi_{f,4} & {- \psi_{f,3}} \end{bmatrix} \end{matrix}}$

Note that, even though this matrix has

$\begin{pmatrix} 4 \\ {2 - 1} \end{pmatrix} = 4$ columns, and hence, Ψ_(h)·D·Ξ^(f,(2)) is a vector of length 4, it suffices to communicate only β=3 symbols from the helper node to the failed node and the fourth symbol can be reconstructed from the other 3 symbols at the failed node. This is due to the fact that the rank of matrix Ξ^(f,(2)) equals to β=3. More precisely, a non-zero linear combination of the columns of Ξ^(f,(2)) is zero, that is, Ξ^(f,(2))·[ψ_(f,1)ψ_(f,2)ψ_(f,3)ψ_(f,4)]^(T)=0.  (8M)

Therefore, (if ψ_(f,4)≠0) the helper node h only sends the first β=3 symbols of the vector Ψ_(h)·D·Ξ^(f,(2)), namely, [Ψ_(h)·D·Ξ^(f,(2))]₁, [Ψ_(h)·D·Ξ^(f,(2))]₂, and [Ψ_(h)·D·Ξ^(f,(2))]₃, and the forth symbol [Ψ_(h)·D·Ξ^(f,(2))]₄ can be appended to it at node f from

$\left\lbrack {\Psi_{h} \cdot D \cdot \Xi^{f,{(2)}}} \right\rbrack_{4} = {\psi_{f,4}^{- 1} \cdot {\sum\limits_{i = 1}^{3}{\psi_{f,i} \cdot {\left\lbrack {\Psi_{h} \cdot D \cdot \Xi^{f,{(2)}}} \right\rbrack_{i}.}}}}$

Upon receiving the repair data from d=4 helper nodes {1,2,3,4}, namely {Ψ₁·D·Ξ^(f,(2)), Ψ₂·D·Ξ^(f,(2)), Ψ₃·D·Ξ^(f,(2)), Ψ₄·D·Ξ^(f,(2))}, the failed can stack them to obtain a matrix

$\begin{matrix} {{\begin{bmatrix} {\Psi_{1} \cdot D \cdot \Xi^{f,{(2)}}} \\ {\Psi_{2} \cdot D \cdot \Xi^{f,{(2)}}} \\ {\Psi_{3} \cdot D \cdot \Xi^{f,{(2)}}} \\ {\Psi_{4} \cdot D \cdot \Xi^{f,{(2)}}} \end{bmatrix} = {{{\Psi\left\lbrack {\left\{ {1,2,3,4} \right\},:} \right\rbrack} \cdot D \cdot \Xi^{f,{(2)}}} = {D \cdot \Xi^{f,{(2)}}}}},} & \left( {8N} \right) \end{matrix}$

where the last identity is due to the fact that Ψ[{1,2,3,4}, :]=I is the identity matrix. The techniques described herein refer to this matrix by the repair space matrix of node f, and denote it by R^(f,(2))=D·Ξ^(f,(2))

Using the entries of matrix R^(f,(2)), the techniques described herein can reconstruct the missing coded symbols of the failed node, as formulated in (9). For the sake of illustration, let us focus on the symbol at the position

={2,4} of node f. Recall that rows of matrix R^(f,(2)) are indexed by numbers in [d]={1,2,3,4} and its columns are indexed by subsets of size m−1=1 of [d]. The

-th symbol of node f can be found from a linear combination (with +1 and −1 coefficients) of entries of R^(f,(2)) a positioned at row x and column

\{x} for all x∈

. The coefficients used in this linear combination is given by order of number x in set

, e.g., x=2 is the first (smallest) element of

={2,4}, hence ind_({2,4})(2)=1, and the corresponding coefficient may be (−1)^(ind) ^((2,4)) ⁽²⁾=(−1)¹=−1. Putting things together, the techniques described herein obtain

$\begin{matrix} \begin{matrix} {{\sum\limits_{x \in {\{{2,4}\}}}{\left( {- 1} \right)^{{ind}_{{\{{2,4}\}}^{(x)}}}R_{x,{{\{{2,4}\}}\backslash{\{ x\}}}}^{f,{(2)}}}} = {{- R_{2,{\{ 4\}}}^{f,{(2)}}} + R_{4,{\{ 2\}}}^{f,{(m)}}}} \\ {= {{- \begin{matrix} \left\lbrack {{{- \psi_{f,2}}v_{2,{\{{2,4}\}}}} - {\psi_{f,1}w_{2,{\{{1,2,4}\}}}} -} \right. \\ \left. {\psi_{f,3}w_{2,{\{{2,3,4}\}}}} \right\rbrack \end{matrix}} +}} \\ {\begin{matrix} \left\lbrack {{\psi_{f,4}v_{4,{\{{2,4}\}}}} - {\psi_{f,1}w_{4,{\{{1,2,4}\}}}} +} \right. \\ \left. {\psi_{f,3}w_{4,{\{{2,3,4}\}}}} \right\rbrack \end{matrix}} \\ {= {{\psi_{f,2}v_{2,{\{{2,4}\}}}} + {\psi_{f,4}v_{4,{\{ 2.4\}}}} +}} \\ {{\psi_{f,1}\left( {w_{2,{\{{1,2,4}\}}} - w_{4,{\{{1,2,4}\}}}} \right)} +} \\ {\psi_{f,3}\left( {w_{2,{\{{2,3,4}\}}} + w_{4,{\{{2,3,4}\}}}} \right)} \\ {= {{\psi_{f,2}v_{2,{\{{2,4}\}}}} + {\psi_{f,4}v_{4,{\{{2,4}\}}}} +}} \\ {{\psi_{f,1}w_{1,{\{{1,2,4}\}}}} + {\psi_{f,3}w_{2,{\{{2,3,4}\}}}}} \\ {{= \left\lbrack {\Psi_{3} \cdot D} \right\rbrack_{\{{2,4}\}}},} \end{matrix} & \left( {8O} \right) \end{matrix}$

where in (8O) used the parity equations defined in (11). A general repair scenario with an arbitrary (not necessarily systematic) set of helper nodes

with |

|=d=4 is very similar to that from the systematic nodes, explained above.

Each helper node h∈

computes its repair data by multiplying its content by the repair encoder matrix of failed node f, and sends it to the failed node. The failed node collects {Ψ_(h)·D·Ξ^(f,(2)): h∈

} and stacks them to form the matrix Ψ[

, :]·D·Ξ^(f,(2)), where Ψ[

, :] is the sub-matrix of Ψ obtained by stacking rows indexed by {h: h∈

}. The main difference compared to the systematic helpers case is that unlike in (31), Ψ[

, :] is not an identity matrix in general. However, since Ψ[

, :] is an invertible matrix, the techniques described herein can compute R^(f,(2))=D·Ξ^(f,(2)) as R ^(f,(2))=Ψ[

,:]⁻¹·(Ψ[

,:]·D·Ξ ^(f,(2)))=D·Ξ ^(f,(2)).

Once R^(f,(2)) is computed at node f, the rest of the process is identical the repair from systematic helper nodes.

$\begin{matrix} {{{Symbol}\mspace{14mu} 1} = {{{- \frac{\psi_{f_{1},2}}{\psi_{f_{1},1}}} \times {Symbol}\mspace{14mu} 2} - {\frac{\psi_{f_{1},3}}{\psi_{f_{1},1}} \times {Symbol}\mspace{14mu} 3} - {\frac{\psi_{f_{1},4}}{\psi_{f_{1},1}} \times {Symbol}\mspace{14mu} 4}}} & \left( {8P} \right) \\ {{{Symbol}\mspace{14mu} 5} = {{{- \frac{\psi_{f_{2},2}}{\psi_{f_{2},1}}} \times {Symbol}\mspace{14mu} 6} - {\frac{\psi_{f_{2},3}}{\psi_{f_{2},1}} \times {Symbol}\mspace{14mu} 7} - {\frac{\psi_{f_{2},4}}{\psi_{f_{2},1}} \times {Symbol}\mspace{14mu} 8.}}} & \left( {8Q} \right) \\ {{{Symbol}\mspace{14mu} 8} = {{\frac{\psi_{f_{2},1}\left( {{\psi_{f_{1},1}\psi_{f_{2},2}} - {\psi_{f_{1},2}\psi_{f_{2},1}}} \right)}{\psi_{f_{1},1}\left( {{\psi_{f_{1},1}\psi_{f_{2},4}} - {\psi_{f_{1},4}\psi_{f_{2},1}}} \right)} \times {Symbol}\mspace{14mu} 2} + {{\frac{\psi_{f_{2},1}\left( {{\psi_{f_{1},1}\psi_{f_{2},3}} - {\psi_{f_{1},3}\psi_{f_{2},1}}} \right)}{\psi_{f_{1},1}\left( {{\psi_{f_{1},1}\psi_{f_{2},4}} - {\psi_{f_{1},4}\psi_{f_{2},1}}} \right)}.\;.\;.}\; \times \;{Symbol}\mspace{14mu} 3} + {\frac{\psi_{f_{2},1}}{\psi_{f_{1},1}}{Symbol}\mspace{14mu} 4} + {{\frac{{\psi_{f_{1},1}\psi_{f_{2},2}} - {\psi_{f_{1},2}\psi_{f_{2},1}}}{{\psi_{f_{1},4}\psi_{f_{2},1}} - {\psi_{f_{1},1}\psi_{f_{2},4}}}.\;.\;.}\; \times {Symbol}\mspace{14mu} 6} + {\frac{{\psi_{f_{1},1}\psi_{f_{2},3}} - {\psi_{f_{1},3}\psi_{f_{2},1}}}{{\psi_{f_{1},4}\psi_{f_{2},1}} - {\psi_{f_{1},1}\psi_{f_{2},4}}}{Symbol}\mspace{14mu} 7}}} & \left( {8R} \right) \end{matrix}$

Now, assume two non-systematic nodes in

={f₁, f₂} are simultaneously failed, and the goal is to reconstruct the missing data on f₁ and f₂ using the systematic nodes, i.e., the helper set is

={1,2,3,4}. A naive approach is to repeat the repair scenario for f₁ and f₂. Such a separation-based scheme requires downloading 2β=6 (coded) symbols from each helper node. Alternatively, the techniques described herein show that the repair of nodes f₁ and f₂ can be performed by downloading only β₂=5 symbols from each helper.

The techniques described herein start with Ξ^({f) ¹ ^(,f) ² ^(},(2)) which is basically the concatenation of Ξ^(f) ¹ ^(,(2)) and Ξ^(f) ² ^(,(2)). This matrix is given in (22) below. This is a 6×8 matrix. However, the claim of Proposition 3 implies the rank of this matrix is at most 5. To show this claim, the techniques described herein define the non-zero vector

defined in (23) below and show that this vector is in the left null-space of Ξ^({f) ¹ ^(,f) ² ^(},(2)). The general construction of the null-space is presented in the proof of Proposition 3.

$\begin{matrix} {\Xi^{ɛ,{(2)}} = {\left\lbrack \Xi^{f_{1},{(2)}} \middle| \Xi^{f_{2},{(2)}} \right\rbrack = {\begin{matrix} \begin{matrix} \begin{matrix} \begin{matrix} \; \\ \left\{ {1,2} \right\} \end{matrix} \\ \left\{ {1,3} \right\} \end{matrix} \\ \left\{ {1,4} \right\} \end{matrix} \\ \begin{matrix} \left\{ {2,3} \right\} \\ \begin{matrix} \left\{ {2,4} \right\} \\ \left\{ {3,4} \right\} \end{matrix} \end{matrix} \end{matrix}\begin{matrix} \begin{matrix} \left\{ 1 \right\} & {\mspace{25mu}\left\{ 2 \right\}\mspace{56mu}} & {\left\{ 3 \right\}\mspace{40mu}} & {\left\{ 4 \right\}\mspace{56mu}} & {\left\{ 1 \right\}\mspace{20mu}} & {\mspace{20mu}\left\{ 2 \right\}\mspace{14mu}} & {\mspace{20mu}\left\{ 3 \right\}\mspace{20mu}} & {\;\left\{ 4 \right\}} & \; \end{matrix} & \; \\ \left\lbrack \begin{matrix} \psi_{f_{1},2} & {- \psi_{f_{1},1}} & 0 & 0 \\ \psi_{f_{1},3} & 0 & {- \psi_{f_{1},1}} & 0 \\ \psi_{f_{1},4} & 0 & 0 & {- \psi_{f_{1},1}} \\ 0 & \psi_{f_{1},3} & {- \psi_{f_{1},2}} & 0 \\ 0 & \psi_{f_{1},4} & 0 & {- \psi_{f_{1},2}} \\ 0 & 0 & \psi_{f_{1},4} & {- \psi_{f_{1},3}} \end{matrix} \middle| \begin{matrix} \psi_{f_{2},2} & {- \psi_{f_{2},1}} & 0 & 0 \\ \psi_{f_{2},3} & 0 & {- \psi_{f_{2},1}} & 0 \\ \psi_{f_{2},4} & 0 & 0 & {- \psi_{f_{2},1}} \\ 0 & \psi_{f_{2},3} & {- \psi_{f_{2},2}} & 0 \\ 0 & \psi_{f_{2},4} & 0 & {- \psi_{f_{2},2}} \\ 0 & 0 & \psi_{f_{2},4} & {- \psi_{f_{2},3}} \end{matrix} \right\rbrack & \mspace{11mu} \end{matrix}}}} & (22) \\ \begin{matrix} {\mspace{79mu}{Y^{ɛ,{(2)}} = {\left\{ {3,4} \right\}\begin{matrix} \left\lbrack {{- \overset{\{{1,2}\}}{\begin{matrix} \psi_{j_{1},3} & \psi_{f_{1},4} \\ \psi_{j_{2},3} & \psi_{f_{2},4} \end{matrix}}},{\overset{\{{1,3}\}}{{\begin{matrix} \psi_{j_{1},2} & \psi_{f_{1},4} \\ \psi_{j_{2},1} & \psi_{f_{2},4} \end{matrix}},} - \overset{\{{1,4}\}}{\begin{matrix} \psi_{f_{1},2} & \psi_{f_{1},3} \\ \psi_{f_{2},2} & \psi_{f_{2},3} \end{matrix}}},} \right. \\ {{- \overset{\{{2,3}\}}{\begin{matrix} \psi_{f_{1},1} & \psi_{f_{1},4} \\ \psi_{f_{2},1} & \psi_{j_{2},4} \end{matrix}}},{- \overset{\{{2,4}\}}{\begin{matrix} \psi_{f_{1},1} & \psi_{j_{1},3} \\ \psi_{f_{2},1} & \psi_{j_{2},3} \end{matrix}}},{- \overset{\{{3,4}\}}{\left. {\begin{matrix} \psi_{f_{1},1} & \psi_{f_{1},2} \\ \psi_{f_{2},1} & \psi_{j_{2},2} \end{matrix}} \right\rbrack}}} \end{matrix}}}} \\ {= {\left\{ {3,4} \right\}\begin{matrix} \left\lbrack {\overset{\{{1,2}\}}{{\psi_{j_{1},4}\psi_{f_{2},3}} - {\psi_{f_{1},3}\psi_{f_{2},4}}}\mspace{20mu}\overset{\{{1,3}\}}{{\psi_{f_{1},2}\psi_{f_{2},4}} - {\psi_{f_{1},4}\psi_{j_{2},2}}}\mspace{25mu}\overset{\{{1,4}\}}{{\psi_{f_{1},3}\psi_{f_{2},2}} - {\psi_{j_{1},2}\psi_{f_{2},3}}}} \right. \\ \left. {\overset{\{{2,3}\}}{{\psi_{j_{1},4}\psi_{f_{2},1}} - {\psi_{f_{1},1}\psi_{f_{2},4}}}\mspace{20mu}\overset{\{{2,4}\}}{{\psi_{f_{1},1}\psi_{f_{2},3}} - {\psi_{f_{1},2}\psi_{j_{2},1}}}\mspace{25mu}\overset{\{{3,4}\}}{{\psi_{f_{1},2}\psi_{f_{2},1}} - {\psi_{j_{1},1}\psi_{f_{2},2}}}} \right\rbrack \end{matrix}}} \end{matrix} & (23) \end{matrix}$

First note that

is not an all-zero vector, otherwise

${\frac{\psi_{f_{1},1}}{\psi_{f_{2},1}} = {\frac{\psi_{f_{1},2}}{\psi_{f_{2},2}} = {\frac{\psi_{f_{1},3}}{\psi_{f_{2},3}} = \frac{\psi_{f_{1},4}}{\psi_{f_{2},4}}}}},$

which implies rows Ψ_(f) ₁ and Ψ_(f) ₂ of the encoder matrix are linearly dependent. This is in contradiction with the fact that every d=4 rows of Ψ are linearly independent. Hence, without loss of generality,

${\begin{matrix} \psi_{f_{1},1} & \psi_{f_{1},4} \\ \psi_{f_{2},1} & \psi_{f_{2},4} \end{matrix}} \neq 0.$

In order to prove

Y ℰ , ( 2 ) · ℰ , ( 2 ) = 0

the techniques described herein show that vector

is orthogonal to each column of

. For instance, consider the seventh column of

, labeled by {3} in segment Ξ^(f) ² ^(,(2)). The inner product of

and this column is given by

${{{{- \psi_{f_{2},1}}{\begin{matrix} \psi_{f_{1},2} & \psi_{f_{1},4} \\ \psi_{f_{2},2} & \psi_{f_{2},4} \end{matrix}}} + {\psi_{f_{2},2}{\begin{matrix} \psi_{f_{1},1} & \psi_{f_{1},4} \\ \psi_{f_{2},1} & \psi_{f_{2},4} \end{matrix}}} - {\psi_{f_{2},4}{\begin{matrix} \psi_{f_{1},1} & \psi_{f_{1},2} \\ \psi_{f_{2},1} & \psi_{f_{2},2} \end{matrix}}}} = {{- {\begin{matrix} \psi_{f_{2},1} & \psi_{f_{2},2} & \psi_{f_{2},4} \\ \psi_{f_{1},1} & \psi_{f_{1},2} & \psi_{f_{1},4} \\ \psi_{f_{2},1} & \psi_{f_{2}21} & \psi_{f_{2},4} \end{matrix}}} = 0}},$

where the first equality follows from the Laplace expansion of the determinant with respect to the first row, and the second equality is due to the fact that the first and third rows of the matrix are identical, and hence it is rank-deficient. The existence of a non-zero vector in the left null-space of

implies its rank is at most β₂ ⁽²⁾=5.

Now, assume h=1 is one of the helper nodes. Without loss of generality, the techniques described herein assume ψ_(f) ₁ _(,1)≠0 and ψ_(f) ₂ _(,1)≠0. The repair data sent by node

, has the following 8 symbols

$\begin{matrix} \left\{ \begin{matrix} {{{{Symbol}\mspace{14mu} 1\text{:}\mspace{14mu}\psi_{f_{1},2}v_{1,{\{{1,2}\}}}} + {\psi_{f_{1},3}v_{1,{\{{1,3}\}}}} + {\psi_{f_{1},4}v_{1,{\{{1,4}\}}}}},} \\ {{{{Symbol}\mspace{14mu} 2\text{:}}\mspace{14mu} - {\psi_{f_{1},1}v_{1,{\{{1,2}\}}}} + {\psi_{f_{1},3}w_{1,{\{{1,2,3}\}}}} + {\psi_{f_{1},4}w_{1,{\{{1,2,4}\}}}}},} \\ {{{{Symbol}\mspace{14mu} 3\text{:}}\mspace{14mu} - {\psi_{f_{1},1}v_{1,{\{{1,3}\}}}} - {\psi_{f_{1},2}w_{1,{\{{1,2,3}\}}}} + {\psi_{f_{1},4}w_{1,{\{{1,3,4}\}}}}},} \\ {{{Symbol}\mspace{14mu} 4\text{:}}\mspace{14mu} - {\psi_{f_{1},1}v_{1,{\{{1,4}\}}}} - {\psi_{f_{1},2}w_{1,{\{{1,2,4}\}}}} - {\psi_{f_{1},3}w_{1,{\{{1,3,4}\}}}}} \\ {{{{Symbol}\mspace{14mu} 5\text{:}\mspace{14mu}\psi_{f_{2},2}v_{1,{\{{1,2}\}}}} + {\psi_{f_{2},3}v_{1,{\{{1,3}\}}}} + {\psi_{f_{2},4}v_{1,{\{{1,4}\}}}}},} \\ {{{{Symbol}\mspace{14mu} 6\text{:}}\mspace{11mu} - \;{\psi_{f_{2},1}v_{1,{\{{1,2}\}}}} + {\psi_{f_{2},3}w_{1,{\{{1,2,3}\}}}} + {\psi_{f_{2},4}w_{1,{\{{1,2,4}\}}}}},} \\ {{{{Symbol}\mspace{14mu} 7\text{:}}\mspace{14mu} - {\psi_{f_{2},1}v_{1,{\{{1,3}\}}}} - {\psi_{f_{2},2}w_{1,{\{{1,2,3}\}}}} + {\psi_{f_{2},4}w_{1,{\{{1,3,4}\}}}}},} \\ {{{{Symbol}\mspace{14mu} 8\text{:}}\mspace{14mu} - {\psi_{f_{2},1}v_{1,{\{{1,4}\}}}} - {\psi_{f_{2},2}w_{1,{\{{1,2,4}\}}}} - {\psi_{f_{2},3}w_{1,{\{{1,3,4}\}}}}},} \end{matrix} \right. & \left( {8R} \right) \end{matrix}$

However, Symbol 1, Symbol 5, and Symbol 8 are redundant, and can be reconstructed as linear combinations of the remaining five symbols. It is worth noting that the first and second equations above indicate the dependencies between symbols that are sent for the repair of f₁ and f₂, respectively. The third equation, however, shows an additional dependency across the repair symbols f₁ and and those of f₂. This implies that it suffices for the helper node 1 to send symbols 2, 3, 4, 6, and 7 in to repair two nodes f₁ and f₂, simultaneously.

Next, the techniques described herein review data recovery and exact repair properties for signed determinant codes.

Proposition 1: In a (d; m) signed determinant code, all the data symbols can be recovered from the content of any k=d nodes.

The proof of this proposition is similar to that of Proposition 1, and hence omitted for the sake of brevity.

Consider the repair process of a failed node f∈[n] from an arbitrary set

of |

|=d helpers. The repair-encoder matrix for a (d; m) signed determinant code is defined below.

Definition 1: For a (d; m) signed determinant code with signature σ, and a failed node f∈[n], the repair-encoder matrix Ξ^(f,(m)) is defined as

${{a\begin{pmatrix} d \\ m \end{pmatrix}} \times \begin{pmatrix} d \\ {m - 1} \end{pmatrix}\mspace{14mu}{matrix}},$ whose rows are labeled by m-element subsets of [d] and columns are labeled by (m−1)-element subsets of [d]. The element in row

and column

of this matrix is given by

= { ( - 1 ) ⁢ ψ f , x if ⁢ ⁢ = { x } , 0 otherwise . ( 9 )

Here σ (x)'s are the same signature used in (8).

In order to repair node f, each helper node h∈

multiplies its content Ψ_(h)·D by the repair-encoder matrix of node f to obtain Ψ_(h)·D·Ξ^(f,(m)), and sends the result to node f. Upon receiving d vectors {Ψ_(h)·D·Ξ^(f,(m)): h∈

} and stacking them into a matrix, the failed node obtains

, where

is a full-rank sub-matrix of Ψ, obtained from stacking rows indexed by h∈

. Multiplying by

, the failed node retrieves R ^(f)(D)=D·Ξ ^(f,(m)),  (10)

which is called the repair space of node f. All the coded symbols in node f can be recovered from its repair space as described in the following proposition.

Proposition 2: The coded symbol in column

of node f can be recovered from

$\begin{matrix} {\left\lbrack {\Psi_{f} \cdot D} \right\rbrack_{\mathcal{J}} = {\sum\limits_{x \in \mathcal{J}}{{\left( {- 1} \right)^{{\sigma_{D}(x)} + {{ind}_{\mathcal{J}}(x)}}\left\lbrack {R^{f}(D)} \right\rbrack}_{x,{\mathcal{J}{\text{\textbackslash[}x\rbrack}}}.}}} & (11) \end{matrix}$

This proposition is very similar to Proposition 2. However, due to modification introduced here, the techniques described herein present the proof of the current proposition below.

The required repair-bandwidth of this repair scheme is given below.

Proposition 3: The matrix Ξ^(f,(m)) defined in (9) has rank

$\beta_{m} = {\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}.}$ Therefore, even though the number of entries in vector

${{\Psi_{h} \cdot D \cdot \Xi^{f,{(m)}}}\mspace{14mu}{is}\mspace{14mu}\begin{pmatrix} d \\ {m - 1} \end{pmatrix}},$ it can be fully sent to the failed node by communicating only

$\beta_{m} = \begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}$ symbols in

.

Remark 2: Note that a signed determinant code can be defined over any Galois field. In particular, for a code designed over GF(2^(S)) with characteristic 2, the techniques described herein have −1=+1, and hence, all the positive and negative signs disappear. Especially, the signs in (8) can be removed and the parity equation in (7) may simply reduce to

=0. Also, the non-zero entries of the repair encoder matrix in (9) may be ψ_(f,x), and the repair equation in (26) may be replaced by

$\left\lbrack {\Psi_{f} \cdot S} \right\rbrack_{\mathcal{J}} = {\sum\limits_{x \in \mathcal{J}}{\left\lbrack {R^{f}(D)} \right\rbrack_{x,{\mathcal{J} \smallsetminus {\{ x\}}}}.}}$

In this section, the techniques described herein present a simple example, through which the techniques described herein explain the core idea of this code construction. More precisely, the techniques described herein show how cascading several signed determinant codes allows us to break the constraint k=d of the signed determinant codes.

The techniques described herein consider a code with parameters (n=6, k=3, d=4) corresponding to mode μ=3. Therefore, from (3) the parameters of this code are given by (α, β, F)=(8,4,24). To construct such a code, the techniques described herein start by an (n′=n=6, k′=d=4, d′=d=4) signed determinant code of mode m=μ=3 with an all-zero signature. The message matrix for this code is given by

$\begin{matrix} {\left\{ {1,2,3} \right\}} & {\left\{ {1,2,4} \right\}} & {\left\{ {1,3,4} \right\}} & {\left\{ {2,3,4} \right\}} \end{matrix}{{\mathbb{P}} = {\begin{matrix} 1 \\ 2 \\ 3 \\ 4 \end{matrix}\begin{bmatrix} v_{1,{\{{1,2,3}\}}}^{< 0 >} & v_{1,{\{{1,2,4}\}}}^{< 0 >} & v_{1,{\{{1,3,4}\}}}^{< 0 >} & w_{1,{\{{1,2,3,4}\}}}^{< 0 >} \\ v_{2,{\{{1,2,3}\}}}^{< 0 >} & v_{2,{\{{1,2,4}\}}}^{< 0 >} & w_{2,{\{{1,2,3,4}\}}}^{< 0 >} & v_{2,{\{{2,3,4}\}}}^{< 0 >} \\ v_{3,{\{{1,2,3}\}}}^{< 0 >} & w_{3,{\{{1,2,3,4}\}}}^{< 0 >} & v_{3,{\{{1,3,4}\}}}^{< 0 >} & v_{3,{\{{2,3,4}\}}}^{< 0 >} \\ w_{4,{\{{1,2,3,4}\}}}^{< 0 >} & v_{4,{\{{1,2,4}\}}}^{< 0 >} & v_{4,{\{{1,3,4}\}}}^{< 0 >} & v_{4,{\{{2,3,4}\}}}^{< 0 >} \end{bmatrix}}}$

Here, the superscript <0> is used to distinguish between the entries of this matrix and another message matrix which may be introduced in the following.

Let us consider a semi-systematic encoder matrix Ψ with n=n′=6 rows. Existence of such semi-systematic encoders with the desired properties is shown.

$\Psi_{6 \times 4} = {\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ \psi_{4,1} & \psi_{4,2} & \psi_{4,3} & \psi_{4,4} \\ \psi_{5,1} & \psi_{5,2} & \psi_{5,3} & \psi_{5,4} \\ \psi_{6,1} & \psi_{6,2} & \psi_{6,3} & \psi_{6,4} \end{bmatrix}.}$

The repair space of this code is given by

$\Psi_{6 \times 4} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ \psi_{4,1} & \psi_{4,2} & \psi_{4,3} & \psi_{4,4} \\ \psi_{5,1} & \psi_{5,2} & \psi_{5,3} & \psi_{5,4} \\ \psi_{6,1} & \psi_{6,2} & \psi_{6,3} & \psi_{6,4} \end{bmatrix}$

It is easy to see that the content of the failed node can be recovered as linear combinations of entries of R^(f)(P), since d=d′=4. For instance, the entry

={1,3,4} of the P-segment of a failed node f is repaired using the equation (11) that is

$\begin{matrix} {\left\lbrack {\Psi_{f} \cdot P} \right\rbrack_{\{{1,3,4}\}} = {\sum\limits_{x \in {\{{1,3,4}\}}}{\left( {- 1} \right)^{{ind}_{{\{{1,3,4}\}}^{(x)}}}\left\lbrack {R^{f,{(4)}}(P)} \right\rbrack}_{x,{{\{{1,3,4}\}}\backslash{\{ x\}}}}}} \\ {= {{- \left( {{{- v_{1,{\{{1,3,4}\}}}^{\langle 0\rangle}}\psi_{f,1}} - {w_{1,{\{{1,2,3,4}\}}}^{\langle 0\rangle}\psi_{f,2}}} \right)} +}} \\ {\left( {{v_{3,{\{{1,3,4}\}}}^{\langle 0\rangle}\psi_{f,3}} + {w_{3,{\{{1,2,3,4}\}}}^{\langle 0\rangle}\psi_{f,2}}} \right) -} \\ {\left( {{w_{4,{\{{1,2,3,4}\}}}^{\langle 0\rangle}\psi_{f,2}} - {v_{4,{\{{1,3,4}\}}}^{\langle 0\rangle}\psi_{f,4}}} \right)} \\ {= {{v_{1,{\{{1,3,4}\}}}^{\langle 0\rangle}\psi_{f,1}} + {v_{3,{\{{1,3,4}\}}}^{\langle 0\rangle}\psi_{f,3}} + {v_{4,{\{{1,3,4}\}}}^{\langle 0\rangle}\psi_{f,4}} +}} \\ {\left( {w_{1,{\{{1,2,3,4}\}}}^{\langle 0\rangle} + w_{3,{\{{1,2,3,4}\}}}^{\langle 0\rangle} - w_{4,{\{{1,2,3,4}\}}}^{\langle 0\rangle}} \right)\psi_{f,2}} \\ {= {{v_{1,{\{{1,3,4}\}}}^{\langle 0\rangle}\psi_{f,1}} + {v_{3,{\{{1,3,4}\}}}^{\langle 0\rangle}\psi_{f,3}} +}} \\ {{v_{4,{\{{1,3,4}\}}}^{\langle 0\rangle}\psi_{f,4}} + {w_{2,{\{{1,2,3,4}\}}}^{\langle 0\rangle}\psi_{f,2}}} \end{matrix}$

Moreover, the code generated by P maintains data recovery from any k′=4 nodes. The question is what happens if the data collector can only access k=3 nodes.

Let us consider the data recovery from the first k=3 systematic nodes (instead of k′=4 nodes). The contents of the systematic node i is identical to the corresponding rows i of P, for i=1,2,3. Therefore, the data collector accessing nodes in

{1,2,3} cannot recover the four symbols in the last row of P. Note that symbol w_(4,{1,2,3,4}) ^(<0>) is a parity symbol, and can be still recovered from observed symbols w_(1,{1,2,3,4}) ^(<0>), w_(2,{1,2,3,4}) ^(<0>), w_(3,{1,2,3,4}) ^(<0>), through the parity equation in (7): w _(4,{1,2,3,4}) ^(<0>) =w _(1,{1,2,3,4}) ^(<0>) −w _(2,{1,2,3,4}) ^(<0>) +w _(3,{1,2,3,4}) ^(<0>).

However, the other three symbols v_(4,{1,2,4}) ^(<0>), v_(4,{1,3,4}) ^(<0>), v_(4,{2,3,4}) ^(<0>) cannot be recovered by the data collector.

In order to recover these missing symbols, the techniques described herein use another signed determinant code (with a lower mode), and use its parity entries to keep a backup copy for each of the missing symbols. The process of copying the missing symbols to the parity entries of another message matrix is called injection throughout this disclosure. Injection simply means adding a symbol to the entry of massage matrix that contains a parity symbol. The techniques described herein also refer to the message matrix to which injection happens as the child node of the injection. Similarly, the message matrix whose symbols are injected is called the parent code of the injection. In this example, the child code is of mode m=1 and an all-zero signature σ_(Q)=(0,0,0,0), whose message matrix is given by

$\begin{matrix} {\left\{ 1 \right\}} & {\left\{ 2 \right\}} & {\left\{ 3 \right\}} & {\left\{ 4 \right\}} \end{matrix}{{\mathbb{Q}} = {\begin{matrix} 1 \\ 2 \\ 3 \\ 4 \end{matrix}\begin{bmatrix} v_{1,{\{ 1\}}}^{< 1 >} & w_{1,{\{{1,2}\}}}^{< 1 >} & w_{1,{\{{1,3}\}}}^{< 1 >} & w_{1,{\{{1,4}\}}}^{< 1 >} \\ w_{2,{\{{1,2}\}}}^{< 1 >} & v_{2,{\{ 2\}}}^{< 1 >} & w_{2,{\{{2,3}\}}}^{< 1 >} & w_{2,{\{{2,4}\}}}^{< 1 >} \\ w_{3,{\{{1,3}\}}}^{< 1 >} & w_{3,{\{{2,3}\}}}^{< 1 >} & v_{3,{\{ 3\}}}^{< 1 >} & w_{3,{\{{3,4}\}}}^{< 1 >} \\ w_{4,{\{{1,4}\}}}^{< 1 >} & w_{4,{\{{2,4}\}}}^{< 1 >} & w_{4,{\{{3,4}\}}}^{< 1 >} & v_{4,{\{ 4\}}}^{< 1 >} \end{bmatrix}}}$

Note that there are three redundant symbols in the top three rows of the Q, since the parity equation in (7) implies w _(2,{1,2}) ^(<1>) =w _(1,{1,2}) ^(<1>), w _(3,{1,3}) ^(<1>) =w _(1,{1,3}) ^(<1>), w _(3,{2,3}) ^(<1>) =w _(2,{2,3}) ^(<1>).

hence, the techniques described herein can use these redundant symbols to backup the missing symbols of P. The techniques described herein denote the modified version of the message matrix Q by Q. Concatenating P and Q results in a super-message matrix:

$\begin{matrix} {\left\{ {1,2,3} \right\}} & {\left\{ {1,2,4} \right\}} & {\left\{ {1,3,4} \right\}} & {\left\{ {2,3,4} \right\}} & {\left\{ 1 \right\}} & {\left\{ 2 \right\}} & \left\{ 3 \right\} & {\left\{ 4 \right\}} \end{matrix}{M = {\left\lbrack {{\mathbb{P}}{❘Q}} \right\rbrack = {\begin{matrix} 1 \\ 2 \\ 3 \\ 4 \end{matrix}\begin{bmatrix} v_{1,{\{{1,2,3}\}}}^{< 0 >} & v_{1,{\{{1,2,4}\}}}^{< 0 >} & v_{1,{\{{1,3,4}\}}}^{< 0 >} & w_{1,{\{{1,2,3,4}\}}}^{< 0 >} & \ldots & \ldots & v_{1,{\{ 1\}}}^{< 1 >} & w_{1,{\{{1,2}\}}}^{< 1 >} & w_{1,{\{{1,3}\}}}^{< 1 >} & w_{1,{\{{1,4}\}}}^{< 1 >} \\ v_{2,{\{{1,2,3}\}}}^{< 0 >} & v_{2,{\{{1,2,4}\}}}^{< 0 >} & w_{2,{\{{1,2,3,4}\}}}^{< 0 >} & v_{2,{\{{2,3,4}\}}}^{< 0 >} & \ldots & \ldots & {w_{2,{\{{1,2}\}}}^{< 1 >} + A} & v_{2,{\{ 2\}}}^{< 1 >} & w_{2,{\{{2,3}\}}}^{< 1 >} & w_{2,{\{{2,4}\}}}^{< 1 >} \\ v_{3,{\{{1,2,3}\}}}^{< 0 >} & w_{3,{\{{1,2,3,4}\}}}^{< 0 >} & v_{3,{\{{1,3,4}\}}}^{< 0 >} & v_{3,{\{{2,3,4}\}}}^{< 0 >} & \ldots & \ldots & {w_{3,{\{{1,3}\}}}^{< 1 >} + B} & {w_{3,{\{{2,3}\}}}^{< 1 >} + C} & v_{3,{\{ 3\}}}^{< 1 >} & w_{3,{\{{3,4}\}}}^{< 1 >} \\ w_{4,{\{{1,2,3,4}\}}}^{< 0 >} & v_{4,{\{{1,2,4}\}}}^{< 0 >} & v_{4,{\{{1,3,4}\}}}^{< 0 >} & v_{4,{\{{2,3,4}\}}}^{< 0 >} & \ldots & \ldots & w_{4,{\{{1,4}\}}}^{< 1 >} & w_{4,{\{{2,4}\}}}^{< 1 >} & w_{4,{\{{3,4}\}}}^{< 1 >} & v_{4,{\{ 4\}}}^{< 1 >} \end{bmatrix}}}}$

where A, B, and C may be determined such that the missing symbols v_(4,{1,2,4}) ^(<0>), v_(4,{1,3,4}) ^(<0>), v_(4,{2,3,4}) ^(<0>) can be fully retrieved from (A, B, C). Note that with this modification, the recovery problem (from the first k=3 nodes) may be resolved.

Now, consider a failed node f. Note that before the injection, each entry [Ψ_(f)·Q] could be recovered from the repair space R^(f)(Q), given by

It is easy to verify that using Equation (11) the repair of entry

={x} of the child code is given by

$\begin{matrix} {{R^{f}({\mathbb{Q}})} = {{{{\begin{matrix} 1 \\ 2 \\ 3 \\ 4 \end{matrix}\left\lbrack \text{⁠}\begin{matrix} {{{- v_{1,{\{ 1\}}}^{< 1 >}}\psi f},1} & {{{- w_{1,{\{{1,2}\}}}^{< 1 >}}\psi f},2} & {{{- w_{1,{\{{1,3}\}}}^{< 1 >}}\psi f},3} & {{{- w_{1,{\{{1,4}\}}}^{< 1 >}}\psi f},4} \\ {{{- w_{2,{\{{1,2}\}}}^{< 1 >}}\psi f},1} & {{{- v_{2,{\{ 2\}}}^{< 1 >}}\psi f},2} & {{{- w_{2,{\{{2,3}\}}}^{< 1 >}}\psi f},3} & {{{- w_{2,{\{{2,4}\}}}^{< 1 >}}\psi f},4} \\ {{{- w_{3,{\{{1,3}\}}}^{< 1 >}}\psi f},1} & {{{- w_{3,{\{{2,3}\}}}^{< 1 >}}\psi f},2} & {{{- v_{3,{\{ 3\}}}^{< 1 >}}\psi f},3} & {{{- w_{3,{\{{3,4}\}}}^{< 1 >}}\psi f},4} \\ {{{- w_{4,{\{{1,4}\}}}^{< 1 >}}\psi f},1} & {{{- w_{4,{\{{2,4}\}}}^{< 1 >}}\psi f},2} & {{{- w_{4,{\{{3,4}\}}}^{< 1 >}}\psi f},3} & {{{- v_{4,{\{ 4\}}}^{< 1 >}}\psi f},4} \end{matrix} \right\rbrack}\left\lbrack {\Psi_{f} \cdot Q} \right\rbrack}_{\mathcal{J}} = {{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{in{d_{\mathcal{J}}(x)}}\left\lbrack {R^{f}(Q)} \right\rbrack}_{x,{\mathcal{J}\backslash{\{ x\}}}}} = {- \left\lbrack {R^{f}(Q)} \right\rbrack_{x,\varnothing}}}}}} & (12) \end{matrix}$

However, after this modification, the child code Q is not a signed determinant code anymore, and the exact repair property may fail. The four coded symbols corresponding to the Q segment of a failed node f are given by

$\quad\left( \begin{matrix} {{\left\{ 1 \right\}\text{:}\mspace{11mu}\psi_{f,1}v_{1,{\{ 1\}}}^{\langle 1\rangle}} + {\psi_{f,2}\left( {w_{2,{\{{1,2}\}}}^{\langle 1\rangle} + A} \right)} + {\psi_{f,3}\left( {w_{3,{\{{1,3}\}}}^{\langle 1\rangle} + B} \right)} + {\psi_{f,4}w_{4,{\{{1,4}\}}}^{\langle 1\rangle}}} \\ {{\left\{ 2 \right\}\text{:}\mspace{11mu}\psi_{f,2}v_{2,{\{ 2\}}}^{\langle 1\rangle}} + {\psi_{f,1}w_{1,{\{{1,2}\}}}^{\langle 1\rangle}} + {\psi_{f,3}\left( {w_{3,{\{{2,3}\}}}^{\langle 1\rangle} + C} \right)} + {\psi_{f,4}w_{4,{\{{2,4}\}}}^{\langle 1\rangle}}} \\ {{\left\{ 3 \right\}\text{:}\mspace{11mu}\psi_{f,3}v_{3,{\{ 3\}}}^{\langle 1\rangle}} + {\psi_{f,1}w_{1,{\{{1,3}\}}}^{\langle 1\rangle}} + {\psi_{f,2}w_{2,{\{{2,3}\}}}^{\langle 1\rangle}} + {\psi_{f,4}w_{4,{\{{3,4}\}}}^{\langle 1\rangle}}} \\ {{\left\{ 4 \right\}\text{:}\mspace{11mu}\psi_{f,4}v_{4,{\{ 4\}}}^{\langle 1\rangle}} + {\psi_{f,1}w_{1,{\{{1,4}\}}}^{\langle 1\rangle}} + {\psi_{f,2}\left( {w_{2,{\{{2,4}\}}}^{\langle 1\rangle} + {\psi_{f,3}{w_{3,{\{{3,4}\}}}^{\langle 1\rangle}.}}} \right.}} \end{matrix} \right.$

On the other hand, the repair space of the failed node for the modified code Q, i.e., R^(f)(Q)=Q·Ξ^(f,(1)), is given by

${R^{f}(Q)} = {\begin{matrix} \begin{matrix} \begin{matrix} 1 \\ 2 \end{matrix} \\ 3 \end{matrix} \\ 4 \end{matrix}\begin{bmatrix} \begin{matrix} \begin{matrix} {{{- \upsilon_{1,{\{ 1\}}}^{\langle 1\rangle}}\psi_{f,1}} - {w_{1,{\{{1,2}\}}}^{\langle 1\rangle}\psi_{f,2}} - {w_{1,{\{{1,3}\}}}^{\langle 1\rangle}\psi_{f,3}} - {w_{1,{\{{1,4}\}}}^{\langle 1\rangle}\psi_{f,4}}} \\ {{{- \left( {w_{2,{\{{1,2}\}}}^{\langle 1\rangle} + A} \right)}\mspace{11mu}\psi_{f,1}} - {\upsilon_{2,{\{ 2\}}}^{\langle 1\rangle}\psi_{f,2}} - {w_{2,{\{{2,3}\}}}^{\langle 1\rangle}\psi_{f,3}} - {w_{2,{\{{2,4}\}}}^{\langle 1\rangle}\psi_{f,4}}} \end{matrix} \\ \underset{\_}{{{- \left( {w_{3,{\{{1,3}\}}}^{\langle 1\rangle} + B} \right)}\mspace{11mu}\psi_{f,1}} - {\left( {w_{3,{\{{2,3}\}}}^{\langle 1\rangle} + C} \right)\mspace{11mu}\psi_{f,2}} - {\upsilon_{3,{\{ 3\}}}^{\langle 1\rangle}\psi_{f,3}} - {w_{3,{\{{3,4}\}}}^{\langle 1\rangle}\psi_{f,4}}} \end{matrix} \\ {{{- w_{4,{\{{1,4}\}}}^{\langle 1\rangle}}\psi_{f,1}} - {w_{4,{\{{2,4}\}}}^{\langle 1\rangle}\psi_{f,2}} - {w_{4,{\{{3,4}\}}}^{\langle 1\rangle}\psi_{f,3}} - {\upsilon_{4,{\{ 4\}}}^{\langle 1\rangle}\psi_{f,4}}} \end{bmatrix}}$

Comparing the symbols of the failed node against the entries of the repair space, it turns out that only [Ψ_(f)·Q]_({4}) can be found from −[R^(f)(Q)]_(4,ø), while there is a mismatch for the other three symbols, due to injections of A, B, and C. Let us compare [Ψ_(f)·Q]_({1}) and −[R^(f)(Q)]_(1,ø). Their difference is given by [Ψ_(f) ·Q]_({1})+[R ^(f)(Q)]_(1,ø)=ψ_(f,2) A+ψ _(f,3) B.  (14)

Note that by setting A=v_(4,{1,2,4}) ^(<0>), B=v_(4,{1,3,4}) ^(<0>), C=v_(4,{2,3,4}) ^(<0>)

this difference reduces to ψ_(f,2)v_(4,{1,2,4}) ^(<0>)+ψ_(f,3)v_(4,{1,3,4}) ^(<0>), which is exactly the entry at position (4, {1,4}) of R^(f)(P), the repair space of the parent code. That is, the missing symbol of the failed node in its Q segment can be retrieved using the repair space of Q and P. It is easy to check that with the same assignment of A, B, and C given in (14), all the four symbols of the failed node in its Q segment can be recovered through [Ψ_(f) ·Q]_({1})=−[R ^(f)(Q)]_(1,ø)+[R ^(f)(P)]_(4,{1,4}), [Ψ_(f) ·Q]_({2})=−[R ^(f)(Q)]_(2,ø)+[R ^(f)(P)]_(4,{2,4}), [Ψ_(f) ·Q]_({3})=−[R ^(f)(Q)]_(3,ø)+[R ^(f)(P)]_(4,{3,4}), [Ψ_(f) ·Q]_({4})=−[R ^(f)(Q)]_(4,ø).

In summary, this example showed that (1) for a system with k<d, the data recovery of the (signed) determinant codes fails; (2) the shortcoming in data recovery can be fixed by concatenating new determinant code (called the child code) with the original one (called the parent code), and providing a backup copy for the missing symbols; this may not only fix the data recovery from the systematic nodes, but also for any set of k nodes access by the data collector; (3) the usual repair of the child code may fail due to the injected symbols; and finally (4) this repair can be also fixed by the help of the repair space of the parent code.

In this section, the techniques described herein describe the construction for an (n, k, d) exact-regenerating code. There are k different regenerating codes for a distributed storage system with parameters (n, k, d), operating at different storage vs. repair bandwidth trade-off. The techniques described herein enumerate them by a parameter μ∈{1,2, . . . , k}, which is called the mode of the code. The general framework to construct an (n, k, d; μ) exact-regenerating code is to start with a determinant code with parameters (n′=n; k′=d, d′=d; m=y) (or simply a (d; μ) determinant code), and modify it to an (n, k, d; μ) code for a given k<d.

Consider a (d; μ) determinant code with encoder matrix Ψ and message matrix D. Without loss of generality, the techniques described herein can assume the code is semi-systematic, i.e., Ψ has an identity matrix at its top k rows (see Definition 4), and thus the content of node i∈[k] is the same as the i-th row of the matrix D. From Proposition 1, data recovery can be performed from any k′=d nodes. Now, let k<d be a given parameter, and consider an attempt for data recovery from the first k nodes. It is clear that some symbol in rows [k+1: d] of matrix D cannot be recovered, since they do not appear in the content of the first k nodes. The techniques described herein refer to such symbols as missing symbols. The main idea to overcome this limitation is to protect such missing symbols in data recovery, by providing a backup copy of them in the top k rows. The main challenge is to introduce such backup copies such that they do not demolish the repair process.

FIG. 5 is a conceptual diagram illustrating cascading of determinant codes, in accordance with the techniques described herein.

In this figure, every rectangle represents the message matrix of one determinant code, and t_(m) denotes the number of message matrices of mode m, for m∈{0,1, . . . , μ}. The message matrix at mode m is of size d×α_(m), where

${\alpha_{m} = \left( \frac{d}{m} \right)}.$ These message matrices are placed from the highest mode to the lowest mode. The leftmost message matrix corresponds to the root of the cascade code with mode m=μ. The rightmost message matrices have either a mode of m=1 or m=0. In the message matrices M, some of the symbols in the bottom d−k rows are missing. These missing symbols are backed up by begin injected (adding with a sign) into the parity symbols located at the top k rows of other determinant codes with lower modes. Injections are demonstrated by arrows from a symbol in the parent matrix to a parity symbol in the child matrix.

To this end, the techniques described herein use multiple instances of (d; m) determinant codes with different modes m∈{0, 1, . . . , μ}, and concatenate their message matrices to obtain a super-message matrix, as shown in FIG. 5. This super-message matrix then may be multiplied (from left) by an encoder matrix Ψ to generate the node contents. Therefore, the codewords (the content of the nodes) may be also a concatenation of the codewords of the determinant codes used as building blocks. Recall that there are redundant symbols (see the parity equation in (7)) in each message matrix used in the concatenation. While such redundant symbols play a critical role in the repair process, they have no contribution in the data recovery. The main purpose of concatenating codes is to utilize such redundant symbols to store a backup copy of the missing symbols in the lower (d−k) rows. More precisely, the techniques described herein inject (add to the existing symbol) a missing symbol from the bottom (d−k) rows of a code matrix at mode m₁ (on outer code or parent code) to a parity symbol in top k rows of another code matrix at mode m₂ (in inner code or child code), where m₂<m₁. However, the missing symbols of the inner code with mode m₂ may be also backed up by injection into another code with lower mode m₃<m₂. This leads to a cascade of determinant codes. The details of cascading are discussed in the following sections.

Definition 2: The encoder matrix Ψ for a code with parameters (n, k, d) is defined as an n×d matrix Ψ_(n×d)=[Γ_(n×k)|Υ_(n×(d−k))],

such that

-   -   any k rows of Γ are linearly independent; and     -   any d rows of Ψ are linearly independent.

Note that Vandermonde matrices satisfy both properties. Similar to determinant codes, the super-message matrix of the cascade codes may be multiplied (from left) by an encoder matrix to generate the encoded content of the nodes.

The techniques described herein describe the construction of the super-message matrix in this section. As mentioned before, M can be obtained in two stages, namely,

-   -   Concatenating several determinant codes, including         _(m) copies of the codes of mode m, for m∈{0,1, . . . , μ}. The         values of         _(m)'s are determined later as given in (33);

Injecting the missing symbols at the bottom (d−k) rows of a code at mode j (the parent code) to the parity symbols at the top k rows of a code at mode m (a child code), where m<j.

The techniques described herein refer to the determinant code message matrices used in a super-message matrix as code segments. Similarly, the codewords comprise of multiple codeword segment, each corresponding to one code segment. Each code segment at mode m is originally a determinant code at mode m, namely D^((m)). The techniques described herein start with a root code, which is a determinant code with parameters (d; μ), and in each stage introduce other determinant codes with a lower mode, into which injection is performed. The ultimate super-message matrix may be obtained by concatenating all such injected message matrices of determinant codes.

The details of symbol injection are discussed in this section. The missing symbols at the lower (d−k) rows of a determinant code segment may be treated differently.

Definition 3: Consider an (n, d, d; j) determinant code at mode j with message matrix P. Recall from (6) that symbols in P are of the forms either

with |

|=j or

with |

|=j+1. Therefore, the symbols in P (lower (d−k) rows of P can be divided into four groups:

( P ) = { ± v x , 𝒳 : x ∈ 𝒳 _ , 𝒳 _ = ⌀ } ⋃ { ± w x , : x ∈ = ⌀ } = { P x , 𝒳 : 𝒳 ⊆ [ k + 1 : d ] } , · ⁢ ( P ) = { ± w x , : x ∈ , ≠ ⌀ , ind ( x ) = j + 1 } = { P x , 𝒳 : 𝒳 ⊈ [ k + 1 : d ] , x > max ⁢ 𝒳 } , ( P ) = { ± v x , 𝒳 : x ∈ 𝒳 _ , 𝒳 _ = ⌀ } = { P x , 𝒳 : 𝒳 ⊈ [ k + 1 : d ] , x ∈ 𝒳 } , ( P ) = { ± w x , : x ∈ , ≠ ⌀ , ind ( x ) < j + 1 } = { P x , 𝒳 : 𝒳 ⊈ [ k + 1 : d ] , x ∉ 𝒳 , x < max ⁢ 𝒳 } .

The techniques described herein treat symbols in the above-mentioned four groups as follows:

Symbols in

(P) may be set to zero (nulled). This yields a reduction in F_(j), the number of data symbols stored in the code segment.

Symbols in

(P) are essentially parity symbols and can be recovered from the symbols in P and the parity equation (7). Therefore, the techniques described herein do not need to protect them by injection.

Each symbol in

(P)∪

(P) may be injected into a redundant parity symbol in the top k rows of the message matrix of a determinant code with lower modes. Those codes used for injection are called child codes of P.

Remark 3: For a signed determinant code P with mode(P)=j the number of symbols in

(P) to be protected can be found from

$\begin{matrix} {{{(P)}} = {\left\{ {{{\left( {x,} \right)\text{:}}\underset{\_}{⊄}\left\lceil {{k + 1}:d} \right\rbrack},\ {{} = j},{x \in}} \right\} }} \\ {= {\sum\limits_{u = 1}^{j - 1}{\left\{ {{{\left( {x,} \right)\text{:}{}} = u},{{} = {j - u}},{x \in}} \right\} }}} \\ {= {\sum\limits_{u = 1}^{j - 1}{\begin{pmatrix} k \\ u \end{pmatrix}\begin{pmatrix} {d - k} \\ {j - u} \end{pmatrix}{\left( {j - u} \right).}}}} \end{matrix}$

Similarly, for

 4 ⁢ ( P )  = ⁢  { ( ) ⁢ : ⁢ ⊈ [ k + 1 ; d ] ,   = j , x ∈ [ k + 1 ⁢ : ⁢ ⁢ d ] ⁢ \ ⁢ < max ⁢ ⁢ }  = ⁢  { ( x , ) ⁢ : ⁢ ⁢ ⊈ [ k + 1 ⁢ : ⁢ ⁢ d ] ,   = j + 1 , x ∈ ⁢ \ ⁢ { max ⁢ ⁢ } }  = ⁢ ∑ u = 1 j ⁢  { ( x , ) :  _  = u ,   = j + 1 - u , x ∈ ⁢ \ ⁢ { max ⁢ } }  = ⁢ ∑ u = 1 j ⁢ ( k u ) ⁢ ( d - k j + 1 - u ) ⁢ ( j - u ) ( 15 )

where in (15),

=

∪{x}, with |

|=j+1. This implies there is a total of

 3 ⁢ ( P ) ⋃ 4 ⁢ ( P )  = ∑ u = 1 j - 1 ⁢ ( k u ) ⁢ ( d - k + 1 j - u + 1 ) ⁢ ( j - u ) ( 16 )

symbols in a signed determinant code of mode j to be injected.

For each injection, the techniques described herein refer to the code whose symbols in the lower part need protection as the parent code. Furthermore, the code into which symbols are injected is called the child code.

Remark 4: Note that the techniques described herein may need multiple child codes for a parent code to protect all the symbols in

(P)∪

(P). However, for each child code, there is only one parent code that injects symbols into it. This leads to the tree structure for the injection hierarchy.

Consider a parent code with message matrix P, which is a (d; j) signed determinant code with mode j. The techniques described herein introduce several child codes for P to inject its symbols into. The techniques described herein distinguish these child codes by a pair (b,

), satisfying b∈[k+1:d],

⊆[k+1: d], b≤max

.

The techniques described herein refer to (b,

) as the injection pair. Furthermore, the techniques described herein denote tha child code of P code associated with an injection pair (b,

) by

$Q_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}$

(or simply Q, whenever it does it cause a confusion) which is a signed determinant code with parameters (d; m) where its mode satisfies mode(Q)=mode(P)−|

|−1.

$\begin{matrix} {{{\sigma_{Q}(i)} = {1 + {\sigma_{P}(i)} + {{ind}_{\mathcal{B}\bigcup{\lbrack i\rbrack}}(i)}}},{\forall{i \in \lbrack d\rbrack}},} & (17) \end{matrix}$

where μ_(P)(i) are the sign parameters of the parent codes.

Symbols of code P may be injected into the message matrices of its child codes, i.e., added to (some of) the entries of the message matrix

$Q_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}.$ The techniques described herein denote the modified version (after injection) of child code

$Q_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}$

by

$Q_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}.$ This modification is modeled by adding the matrix of injection symbols

$\Delta_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}$ to the original

$Q_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}$

matrix, i.e.,

$\begin{matrix} {Q_{{\overset{b,\mathcal{B}}{\leftarrow}}_{P}} = {Q_{{\overset{b,\mathcal{B}}{\leftarrow}}_{P}} + {\Delta_{{\overset{b,\mathcal{B}}{\leftarrow}}_{P}}.}}} & (18) \end{matrix}$

Here

$\Delta_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}$

is a matrix with the same size as Q, that specifies the difference between the before- and after-injection. For a code with injection pair (b,

), the symbol injected into row i and column

is given by

$\begin{matrix} {\left\lbrack \Delta_{{\underset{\leftarrow}{b,\mathcal{B}}\;}_{P}} \right\rbrack_{i,} = \left( \begin{matrix} {\left( {- 1} \right)} & {{{{if}\mspace{14mu} i} >},{i \notin \mathcal{B}},} \\ 0 & {{otherwise}.} \end{matrix} \right.} & (19) \end{matrix}$

Here, the coordinates of injection satisfy i∈[d] and

⊆[d] with |

|=m=mode(Q).

Note that symbols of the code Q may also need to be injected into the message matrix of another code, which is a child code of Q (and hence grandchild code of P).

Hence, injections may be performed in a cascade manner. The ultimate super-message matrix may be obtained by concatenating all modified (after injection) message matrices.

The following remarks are provided for a comprehensive description of the injection process. However, they do not play a critical role in the proofs, and can be skipped.

Remark 5: The injection equation in (19) specifies the injection from the child code's perspective, i.e., for a given entry (row i and column

) of a child code message matrix with injection pair (b,

), the equation determines whether an injection into this entry is performed, and specifies the to-be-injected entry of the parent code. This representation is the most compact and useful form to prove the fundamental properties of the code. However, it is more intuitive to describe the injection from the parent code's point of view, that is, for every symbol in groups

(P)∪

(P) of a parent code P, specify the position(s) and parameters of child code(s) to which that symbol may be injected. In the following, the techniques described herein specify injection equations from the child code's perspective. It is worth mentioning that a single symbol might be injected to several child codes. One of such injections is called primary and the rest are called secondary.

FIG. 6 is a conceptual diagram illustrating symbol injection, in accordance with the techniques of this disclosure. The shaded cells in the column indicate the set

for an element (x,

). The primary injection for a v-symbols in

₃ where x∈

in shown in (I). The coordinates of the injection are given by (y,

)=(max

\{max

}). Therefore, the child code is a determinant code of mode |

|=|

|, designated by an injection pair (b,

)=(x,

). The same v-symbol may be injected (perhaps multiple times) as secondary injections. As indicated in (II), the coordinates of a secondary injection are given by (y,

) where i can be any element of

, and

includes the entire

as well as an arbitrary subset of

⊆

_([k+1:y−1]) (one injection for each pair of (y,

). The child code used for each such injection is a determinant code of mode |

|=|

∪

|, which is identified by an injection pair (b,

)=(x,

_([k+1:d])\(

∪{y})).

$\begin{matrix} {{{Primary}{injection}{of}v - {symbols}:}{{{{for}{any}\left( {x,X} \right){such}{that}\overset{\_}{X}} \neq {\varnothing{and}x}} \in \underline{X}}\left( {{i.e.},{v_{x;X} \in {\mathcal{G}_{3}(P)}}} \right){P_{x,X} = {{{\left( {- 1} \right)^{\sigma_{P}(x)}v_{x,X}}\overset{\pm 1}{\rightarrow}\left\lbrack Q_{{\underset{\leftarrow}{x,\underline{X}}}_{P}} \right\rbrack_{{\max\overset{\_}{X}},{\overset{\_}{X}\backslash{\{{\max\overset{\_}{X}}\}}}}} = {\left( {- 1} \right)^{\sigma_{Q}({\max\overset{\_}{X}})}{w_{{\max\overset{\_}{X}},\overset{\_}{X}}^{({x,\underline{X},P})}.}}}}} & (20) \end{matrix}$

Here Q is a signed determinant code of mode mode(Q)=|

|−1,

and the superscript of the w-symbol in the parent code's message matrix is a tuple of the form (b,

, P) where (b,

) is the injection-pair associated to the child code, and P is the parent, for which code Q is introduced. Moreover ±1 on the arrow indicates that the injection takes place after a proper change of sign. Here, this sign is determined by

$\left( {- 1} \right)^{1 + {\sigma_{P}({\max\overset{\_}{\mathcal{X}}})} + {{ind}_{\mathcal{X}}({\max\overset{\_}{\mathcal{X}}})}}$

More precisely, the symbol at row max

and column

of the child code may be modified from

$\begin{matrix} {{\left\lbrack Q_{{\underset{\leftarrow}{x,\underline{X}}}_{P}} \right\rbrack_{{\max\overset{\_}{X}},{\overset{\_}{X}\backslash{\{{\max\overset{\_}{X}}\}}}} = {\left( {- 1} \right)^{\sigma_{Q}({\max\overset{\_}{X}})}w_{{\max\overset{\_}{X}},\overset{\_}{X}}^{({x,\underline{X},P})}{to}}}\begin{matrix} {\left\lbrack Q_{{\underset{\leftarrow}{x,\underline{X}}}_{P}} \right\rbrack_{{\max\overset{\_}{X}},{\overset{\_}{X}\backslash{\{{\max\overset{\_}{X}}\}}}} = {{\left( {- 1} \right)^{\sigma_{Q}({\max\overset{\_}{X}})}w_{{\max\overset{\_}{X}},\overset{\_}{X}}^{({x,\underline{X},P})}} +}} \\ {\left( {- 1} \right)^{1 + {\sigma_{Q}({\max\overset{\_}{X}})} + {{ind}_{x}({\max\overset{\_}{X}})}}\left( {- 1} \right)^{\sigma_{P}(x)}{v_{x,X}.}} \end{matrix}} &  \end{matrix}$

Secondary injection of v-symbol: Beside the injections described in (I), a symbol

with

≠Ø and x∈

may be also injected as

$\begin{matrix} {{P_{x,X} = {{{\left( {- 1} \right)^{\sigma_{P}(x)}v_{x,X}}\overset{\pm 1}{\rightarrow}\left\lbrack Q_{{\underset{\leftarrow}{x,{X_{\lbrack{{y + 1}:d}\rbrack}\bigcup\mathcal{Y}^{\prime}}}}_{P}} \right\rbrack_{y,{\overset{\_}{X}\bigcup\mathcal{Y}}}} = {\left( {- 1} \right)^{\sigma_{Q}(y)}w_{y,{\overset{\_}{X}\bigcup\mathcal{Y}\bigcup{\{ y\}}}}^{({x,{X_{\lbrack{{y + 1}:d}\rbrack}\bigcup\mathcal{Y}^{\prime}},P})}}}},} & (21) \end{matrix}$

for every y∈

and (

,

′) that partition

_([k+1:y−1]), that is,

∩

′=ø and

∪

′=

_([k+1:y−1]). Moreover, such a secondary injection may be performed only if x≤max

_([y+1:d])∪

′. The techniques described herein used

_([k+1:y−1]) to denote the set

∩[k+1: y−1], and

_([y+1:d]) to specify the set

∩[y+1:d]. The sign of injection is given by

(−1)^(1 + σ_(p)(y) + ind_(x)(y)). Note that the mode of the child code is mode(Q)=|

∪

|.

Primary injection of w-symbols: for every pair (x,

) such that

≠ø, x∈[k+1:d]

and x<max

∪∈

(P)),

$\begin{matrix} {P_{x,X} = {{{\left( {- 1} \right)^{\sigma_{P}(x)}w_{x,{X\bigcup{\{ x\}}}}}\overset{\pm 1}{\rightarrow}\left\lbrack Q_{{\underset{\leftarrow}{x,\underline{X}}}_{P}} \right\rbrack_{{\max\overset{\_}{X}},{\overset{\_}{X}\backslash{\{{\max\overset{\_}{X}}\}}}}} = {\left( {- 1} \right)^{\sigma_{Q}({\max\overset{\_}{X}})}{w_{{\max\overset{\_}{X}},\overset{\_}{X}}^{({x,\underline{X},P})}.}}}} & (22) \end{matrix}$

Here, the sign of injected symbol is determined by

$\left( {- 1} \right)^{1 + {\sigma_{P}({\max\overset{\_}{\mathcal{X}}})} + {{ind}_{\mathcal{X}}({\max\overset{\_}{\mathcal{X}}})}}$ and the mode of the child code is mode(Q)=

−1.

Secondary injection of w-symbols: Similar to the v-symbols, w-symbols may be also re-injected. Each

with

≠ø, x∈[k+1:d]

with x<max

, may be injected as

$\begin{matrix} {{P_{x,X} = {{{\left( {- 1} \right)^{\sigma_{P}(x)}w_{x,{X\bigcup{\{ x\}}}}}\overset{\pm 1}{\rightarrow}\left\lbrack Q_{{\underset{\leftarrow}{x,{X_{\lbrack{{y + 1}:d}\rbrack}\bigcup\mathcal{Y}^{\prime}}}}_{P}} \right\rbrack_{y,{\overset{\_}{X}\bigcup\mathcal{Y}}}} = {\left( {- 1} \right)^{\sigma_{Q}(y)}w_{y,{\overset{\_}{X}\bigcup\mathcal{Y}\bigcup{\{ y\}}}}^{({x,{X_{\lbrack{{y + 1}:d}\rbrack}\bigcup\mathcal{Y}^{\prime}},P})}}}},} & (23) \end{matrix}$ for every y∈

and (

,

) that partition

Moreover, such a secondary injection may be performed only if x·≤max

∪

. The sign of injection is given by

(−1)^(1 + σ_(p)(y) + ind_(x)(y)), and the sign of the child code is given by mode(Q)=|

∪

|.

Remark 6: Note that each symbol

∈

₃(P) may be injected multiple times, including one primary injection as specified in (20) and several secondary injections are given in (21). However, each secondary injection is performed into a different child code, as the injection-pairs (b,

)=(x,

∪(

∩[y+1:d]))

are different for distinct pairs of (y,

), when

⊆

∩[k+1: y−1].

The primary injection governed by (20) is an injection into the top k rows of the child code (since the row index of the child symbol w is y=max

∈[k]), and may be responsible for data recovery. Once such symbols are injected into a child code, the modified child code may not be a determinant code anymore, and its repair process may fail. The secondary injections of this symbol are proposed to maintain the repair structure. Note that in the injections specified in (21) the row index of the host symbol is y∈

⊆[k+1: d], i.e., the injections performed into the lower (d−k) rows of the child codes.

A similar argument holds for the injection of w-symbols, as the primary injection in (22) is into the top k rows of the host code message matrix data recovery shows the injection for recovery in order to provide a backup for data recovery, and the secondary injection in (23) specifies all injections for the repair into the lower (d−k) rows of various children codes.

It is straightforward to evaluate the number of child codes of mode m introduced for a parent code of mode j. First note that for a parent code P of mode j, all the child codes are determinant codes of the form

$Q_{\underset{\leftarrow_{P}}{b,\mathcal{B}}},$ into which missing symbols of P may be injected. The mode of such child code is given by m=mode(Q)=mode(P)−|

|−1=j−|

|−1.

In order to count the number of possible injection pairs (b,

)'s the techniques described herein can distinguish two cases. First, if b∈

, then there are

$\quad\begin{pmatrix} {d - k} \\ {\mathcal{B}} \end{pmatrix}$ choices of

, and there are |

| choices for b∈

. Second, if b∉

, then

∪{b} is a subset of [k+1: d] of size |

|+1. Then, there are

$\quad\begin{pmatrix} {d - k} \\ {{\mathcal{B}} + 1} \end{pmatrix}$ choices for

∪{b}, and for each choice, b can be any entry except the largest one.

Therefore the total number of injection pairs for a parent code of mode j is given by

$\begin{matrix} {{{\left( {j - m - 1} \right)\begin{pmatrix} {d - k} \\ {j - m - 1} \end{pmatrix}} + {\left( {j - m - 1} \right)\begin{pmatrix} {d - k} \\ {j - m} \end{pmatrix}}} = {\left( {j - m - 1} \right){\begin{pmatrix} {d - k + 1} \\ {j - m} \end{pmatrix}.}}} & (24) \end{matrix}$

Remark 7: Recall from (20) and (22) that each primary injection may be into a w-symbol in the child code at the position (max

,

\{max

}). The number of such w-symbols in a determinant code of mode m is only

$\begin{pmatrix} k \\ {m + 1} \end{pmatrix},$ since

⊆[k] and |

|=m+1. On the other hand, from (24), the number of child codes of mode m introduced for the primary injections of a parent code P of mode j. Therefore, the total number of w symbols hosting primary injections of a code of mode j is given by

$\begin{matrix} {{\sum\limits_{m = 0}^{j - 1}{\left( {j - m - 1} \right)\begin{pmatrix} {d - k + 1} \\ {j - m} \end{pmatrix}\begin{pmatrix} k \\ {m + 1} \end{pmatrix}}},} & (25) \end{matrix}$

which is exactly the same as |

(P)∪

(P)|, i.e., the number of symbols to be injected as evaluated in (16).

Remark 8. Consider a w-symbol in a child code hosting a symbol from the parent code. In primary injections of types I and III, such w-symbol is in the top k rows of the message matrix, and does not need protection. In secondary injections of types II and IV, the w-symbol is positioned in the bottom (d−k) rows. However, for such symbols

${{{ind}_{\overset{\_}{\mathcal{X}}\bigcup\bigcup{\{ y\}}}(y)} = {m + 1}},$

since

⊆[k],

⊆

and y∈[k+1: d]. Hence, such symbol belongs to group

(Q) of the child code, and does not need to be injected into a grandchild code. The implication is that a w-symbol in a child code hosting a symbol from the parent code is never injected into a grandchild code, and therefore injected symbols may not be carried for multiple hops of injections. Moreover, the specification of injections form a parent code P into a child code Q does not depend on whether P is already modified by an earlier injection or not, that is,

$\Delta_{\underset{\leftarrow_{P}}{b,\mathcal{B}}} = {\Delta_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}.}$

The main property of the code proposed in this section is its reliability in spite of at most n−k node failures The following proposition is a formal statement for this property.

Proposition 4: By accessing any k nodes, the content of the stored data file can be recovered.

In the following, the techniques described herein discuss the exact repair property by introducing the repair data that a set of helper nodes

with |

|=d sent in order to repair a failed node f∈[n].

The repair process is performed in a recursive manner from top-to-bottom, i.e., from segments of the codeword of node f with the highest mode to those with the lowest mode.

The repair data sent from a helper node h∈

to the failed node f is simply the concatenation of the repair data to be sent for each code segment. The repair data for each code segment can be obtained by treating each segment as a ordinary signed determinant code. More precisely, helper node h sends

${\bigcup\limits_{Pisacodesegment}\left\{ {\Psi_{h} \cdot P \cdot \Xi^{f \cdot {({{mode}{(P)}})}}} \right\}},$

where Ψ_(h)·P is the codeword segment of node h corresponding to code segment P. In other words, for each codeword segment, the helper node needs to multiply it by the repair encoder matrix of the proper mode, and send the collection of all such multiplications to the failed node. Recall from Proposition 3 that the rank of Ξ^(f,(P)) for a code segment of mode m is only

$\beta^{(m)} = {\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}.}$ The overall repair bandwidth of the code is evaluated in (41).

Upon receiving all the repair data ∪_(P){Ψ_(h)·P·μ^(f,(mode(P))): h∈

}, the failed node stacks the segments corresponding to each code segment P to obtain Ψ[

,:]·P·Ξ ^(f,(mode(P))),

from which, the repair spaces can be retrieved:

$\begin{matrix} {{R^{f}(P)} = {{\Psi\left\lbrack {,:} \right\rbrack}^{- 1} \cdot {\Psi\left\lbrack {,:} \right\rbrack} \cdot P \cdot \Xi^{f,{({{mode}{(P)}})}}}} \\ {{= {P \cdot \Xi^{f,{({{mode}{(P)}})}}}},} \\ {\forall{P\text{:}\mspace{11mu}{{codesegments}.}}} \end{matrix}$

Note that invertibility of Ψ[

, :] is guaranteed. Having the repair spaces for all the code segments, the content of node f can be reconstructed according to the following proposition.

Proposition 5: In the (n, k, d) proposed codes with parameters defined in this disclosure, for every failed node f∈[n] and set of helpers

⊆[n]\{f} with |

|=d, the content of node f can be exactly regenerated from the received repair spaces. More precisely. the symbols at position

in a codeword segment corresponding to a code Q operating at mode m may be repaired through

$\begin{matrix} {\left\lbrack {\Psi_{f} \cdot Q_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}} \right\rbrack_{\mathcal{J}} = {{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{Q}{(x)}} + {{ind}_{\mathcal{J}}{(x)}}}\left\lbrack {R^{f}(Q)} \right\rbrack}_{x,{\mathcal{J}\backslash{\{ x\}}}}} - \left( \begin{matrix} \left\lbrack {R^{f}(P)} \right\rbrack_{b,{\mathcal{J}\bigcup\mathcal{B}}} & {{{{{if}\mspace{14mu}\mathcal{J}}\bigcap\mathcal{B}} = \varnothing},} \\ 0 & {{otherwise},} \end{matrix} \right.}} & (26) \end{matrix}$

where P is the parent code of Q.

Consider the construction of an (n, k, d) cascade code at mode μ, described in this disclosure. Let

_(m) be the number of (d; m) determinant codes of mode m needed to complete all the injections. The super-message matrix M is obtained by concatenating all code segments, which results in a matrix with d rows and a total of

$\sum\limits_{m = 0}^{\mu}{\ell_{m}\alpha_{m}}$ columns. Therefore, the per-node storage capacity of the resulting code may be

$\begin{matrix} {{\alpha\left( {d,{k;\mu}} \right)} = {{\sum\limits_{m = 0}^{\mu}{\ell_{m}\alpha_{m}}} = {\sum\limits_{m = 0}^{\mu}{{\ell_{m}\begin{pmatrix} d \\ m \end{pmatrix}}.}}}} & (27) \end{matrix}$

Similarly, the repair bandwidth of the resulting code may be

$\begin{matrix} {{\beta\left( {d,{k;\mu}} \right)} = {{\sum\limits_{m = 0}^{\mu}{\ell_{m}\beta_{m}}} = {\sum\limits_{m = 0}^{\mu}{{\ell_{m}\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}}.}}}} & (28) \end{matrix}$

The total number of data symbols stored in matrix M is the sum of the number of data symbols in each code segment. A code segment of mode m can store up to

$F_{m} = {m\begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix}}$ symbols. However, recall that data symbols in group

(see Definition 3) may be set to zero, which yields to a reduction in the of symbols. For an (n, d, d; m) determinant code used a code segment, the reduction due to nulling symbols in

is

N m =  1  =  { ⁢ : ⁢ = ∅ }  + m m + 1 ⁢  { : = ∅ }  ( 29 ) = m ⁡ ( d - k m ) + m m + 1 ⁢ ( m + 1 ) ⁢ ( d - k m + 1 ) ( 30 ) = m [ ⁢ ( d - k m ) + ⁢ ( d - k m + 1 ) ] = m ⁡ ( d - k + 1 m + 1 ) ( 31 )

where the coefficient

$\frac{m}{m + 1}$ captures the fact that there are only m data symbols among m+1 w-symbols in each parity group. The number of possible

's is evaluated based on the facts that |

|=m and

∩[k]=ø, which implies

⊆[k+1:d] and there are

$\quad\begin{pmatrix} {d - k} \\ m \end{pmatrix}$ choices of

. Moreover, x∈

can be any of the m elements of

. A similar argument is used to compute the size of the second set. Finally, the techniques described herein used Pascal's identity. Therefore, the techniques described herein can evaluate the total number of data symbols in the super-message matrix as

$\begin{matrix} {{F\left( {d,{k;\mu}} \right)} = {{\sum\limits_{m = 0}^{\mu}{\ell_{m}\left( {F_{m} - N_{m}} \right)}} = {\sum\limits_{m = 0}^{\mu}{\ell_{m}{{m\left\lbrack {\begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix} - \begin{pmatrix} {d - k + 1} \\ {m + 1} \end{pmatrix}} \right\rbrack}.}}}}} & (32) \end{matrix}$

The rest of this section is dedicated to the evaluation of parameters

_(m)'s, the number of code segments of mode m, in order to fully characterize the parameters of the code.

In this section, the techniques described herein derive a recursive relationship between

_(m) parameters. Next, the techniques described herein may solve the recursive equation to evaluate code parameters.

There is one root code with mode μ, i.e.,

_(μ)=1. Let m be an integer in {0, 1, . . . , μ−1}. In general, any code of mode j>m needs child codes of mode m. Recall from (24) that the number of child codes of mode m required for injection from a parent code of mode j is given by

$\left( {j - m - 1} \right){\begin{pmatrix} {d - k + 1} \\ {j - m} \end{pmatrix}.}$ Moreover, parent codes do not share children. Therefore, the total number of required child codes of mode m is given by

$\begin{matrix} {\ell_{m} = {\sum\limits_{j = {m + 1}}^{\mu}{{\ell_{j}\left( {j - m - 1} \right)}{\begin{pmatrix} {d - k + 1} \\ {j - m} \end{pmatrix}.}}}} & (33) \end{matrix}$

This is a reverse (top-to-bottom) recursive equation with starting point

_(μ)=1, and can be solved to obtain a non-recursive expression for

_(m). Note that (33) potentially associates non-zero values to

_(m)'s with m<0. However, the techniques described herein only consider m∈{0, 1, . . . , μ−1}.

Let μ be a fixed non-negative integer. Recall that sequence {

_(m)} is defined in (33) only for m∈{0, 1, . . . , μ}. The techniques described herein first expand the range of m to include all integers, by defining dummy variables {

_(m): m<0 or m>μ} such that

$\begin{matrix} {\ell_{m} = \left\{ \begin{matrix} 1 & {{m = \mu},} \\ {\sum\limits_{j = {m + 1}}^{\mu}{{\ell_{j}\left( {j - m - 1} \right)}\begin{pmatrix} {d - k + 1} \\ {j - m} \end{pmatrix}}} & {m \neq {\mu.}} \end{matrix} \right.} & (34) \end{matrix}$

Note that this immediately implies

_(m)=0 for m>μ. The techniques described herein also define a sequence {p_(m)}_(m =−∞) ^(∞) as p_(m)=

_(μ-m) for all m∈

. The next proposition provides a non-recursive expression for the sequence {p_(m)}_(m).

Lemma 1: The parameters in sequence {p_(m)} can be found from

${p_{m} = {\sum\limits_{t = 0}^{m}{\left( {- 1} \right)^{t}\left( {d - k} \right)^{m - t}\begin{pmatrix} {d - k + T - 1} \\ t \end{pmatrix}}}},$

for 0≤m≤μ.

It is clear that the techniques described herein can immediately find a non-recursive expression for

_(m) using the fact that

_(m)=p_(μ-m). However, it turns out that such a conversion is not helpful, and the techniques described herein can continue with sequence p_(m).

In this section the techniques described herein show that the code parameters obtained in (27), (28), and (32) are equal to the those proposed in Theorem 1. The following lemma may be helpful to simplify the derivation.

Lemma 2: For integer numbers a, b∈

,

$\sum\limits_{m = {- \infty}}^{\infty}\begin{matrix} {{\ell_{m}\begin{pmatrix} {d + a} \\ {m + b} \end{pmatrix}} = {\sum\limits_{m = {- b}}^{\mu}{\left( {d - k} \right)^{\mu - m}{\begin{pmatrix} {k + a} \\ {m + b} \end{pmatrix}.}}}} & (35) \end{matrix}$

Node storage size:

$\begin{matrix} {{\alpha\left( {d,{k;\mu}} \right)} = {{\sum\limits_{m = 0}^{\mu}{\ell_{m}\alpha_{m}}} = {{\sum\limits_{m = 0}^{\mu}{\ell_{m}\begin{pmatrix} d \\ m \end{pmatrix}}} = {\sum\limits_{m = 0}^{\mu}{p_{m - \mu}\begin{pmatrix} d \\ m \end{pmatrix}}}}}} & (36) \\ {\mspace{79mu}{= {\sum\limits_{m = {- \infty}}^{\infty}{p_{m - \mu}\begin{pmatrix} d \\ m \end{pmatrix}}}}} & (37) \\ {\mspace{79mu}{= {\sum\limits_{m = 0}^{\mu}{\left( {d - k} \right)^{\mu - m}{\begin{pmatrix} k \\ m \end{pmatrix}.}}}}} & (38) \end{matrix}$

Note that in (37) the techniques described herein used the fact that the summand is zero for

${{m < {0\mspace{14mu}{since}\mspace{14mu}\begin{pmatrix} d \\ m \end{pmatrix}}} = 0},$ and for m>μp_(m-μ)=0, and (38) follows from Lemma 2 for a=b=0.

Repair bandwidth:

$\begin{matrix} {{\beta\left( {d,{k;\mu}} \right)} = {{\sum\limits_{m = 0}^{\mu}{\ell_{m}\beta_{m}}} = {{\sum\limits_{m = 0}^{\mu}{\ell_{m}\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}}} = {\sum\limits_{m = 0}^{\mu}{p_{m - \mu}\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}}}}}} & (39) \\ {\mspace{79mu}{= {\sum\limits_{m = {- \infty}}^{\infty}{p_{m - \mu}\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}}}}} & (40) \\ {\mspace{79mu}{= {\sum\limits_{m = 1}^{\mu}{\left( {d - k} \right)^{\mu - m}\begin{pmatrix} {k - 1} \\ {m - 1} \end{pmatrix}}}}} & (41) \\ {\mspace{79mu}{= {\sum\limits_{m = 0}^{\mu}{\left( {d - k} \right)^{\mu - m}{\begin{pmatrix} {k - 1} \\ {m - 1} \end{pmatrix}.}}}}} & (42) \end{matrix}$

Here the steps are similar to (37), and (41) is due to Lemma 2 for a=b=−1.

File size:

$\begin{matrix} \begin{matrix} {{F\left( {d,{k;\mu}} \right)} = {\sum\limits_{m = 0}^{\mu}{m\;{\ell_{m}\left\lbrack \ {\begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix} - \ \begin{pmatrix} {d - k + 1} \\ {m + 1} \end{pmatrix}} \right\rbrack}}}} \\ {= {\sum\limits_{m = {- \infty}}^{\infty}{\ell_{m}\left\lbrack {{m\ \begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix}} - {m\ \begin{pmatrix} {d - k + 1} \\ {m + 1} \end{pmatrix}}} \right\rbrack}}} \end{matrix} & (43) \\ {= {{\sum\limits_{m = {- \infty}}^{\infty}{p_{\mu - m}\left\lbrack {{\left( {m + 1} \right)\begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix}} - \begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix} - {\left( {m + 1} \right)\begin{pmatrix} {d - k + 1} \\ {m + 1} \end{pmatrix}} + \begin{pmatrix} {d - k + 1} \\ {m + 1} \end{pmatrix}} \right\rbrack}} = {\sum\limits_{m = {- \infty}}^{\infty}{p_{\mu - m}\left\lbrack {{\left( {d + 1} \right)\begin{pmatrix} d \\ m \end{pmatrix}} - \begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix} - {\left( {d - k + 1} \right)\begin{pmatrix} {d - k} \\ m \end{pmatrix}} + \begin{pmatrix} {d - k + 1} \\ {m + 1} \end{pmatrix}} \right\rbrack}}}} & (44) \\ {= {{\left( {d + 1} \right){\sum\limits_{m = 0}^{\mu}{\left( {d - k} \right)^{\mu - m}\begin{pmatrix} k \\ m \end{pmatrix}}}} - {\sum\limits_{m = {- 1}}^{\mu}{\left( {d - k} \right)^{\mu - m}\begin{pmatrix} {k + 1} \\ {m + 1} \end{pmatrix}}} - {\left( {d - k + 1} \right){\sum\limits_{m = 0}^{\mu}{\left( {d - k} \right)^{\mu - m}\begin{pmatrix} {k - k} \\ m \end{pmatrix}}}} + {\sum\limits_{m = {- 1}}^{\mu}{\left( {d - k} \right)^{\mu - m}\begin{pmatrix} {k - k + 1} \\ {m + 1} \end{pmatrix}}}}} & (45) \\ {= {{\left( {d + 1} \right){\sum\limits_{m = 0}^{\mu}{\left( {d - k} \right)^{\mu - m}\begin{pmatrix} k \\ m \end{pmatrix}}}} - {\sum\limits_{m = {- 1}}^{\mu}{\left( {d - k} \right)^{\mu - m}\begin{pmatrix} {k + 1} \\ {m + 1} \end{pmatrix}}} - {\quad{{\left\lbrack {\left( {d - k + 1} \right)\left( {d - k} \right)^{\mu}} \right\rbrack + \left\lbrack {\left( {d - k} \right)^{\mu + 1} + \left( {d - k} \right)^{\mu}} \right\rbrack} = {{\left( {d + 1} \right){\sum\limits_{m = 0}^{\mu}{\left( {d - k} \right)^{\mu - m}\begin{pmatrix} k \\ m \end{pmatrix}}}} - {\sum\limits_{m = {- 1}}^{\mu}{\left( {d - k} \right)^{\mu - m}\begin{pmatrix} k \\ m \end{pmatrix}}} - {\sum\limits_{m = {- 1}}^{\mu}{\left( {d - k} \right)^{\mu - m}\begin{pmatrix} k \\ {m + 1} \end{pmatrix}}}}}}}} & (46) \\ {\mspace{79mu}{= {{{d{\sum\limits_{m = 0}^{\mu}{\left( {d - k} \right)^{\mu - m}\begin{pmatrix} k \\ m \end{pmatrix}}}} - {\sum\limits_{m = 0}^{\mu + 1}{\left( {d - k} \right)^{\mu + 1 - m}\begin{pmatrix} k \\ m \end{pmatrix}}}}\mspace{79mu} = {{\sum\limits_{m = 0}^{\mu}{{k\left( {d - k} \right)}^{\mu - m}\ \begin{pmatrix} k \\ m \end{pmatrix}}} - {\begin{pmatrix} k \\ {\mu + 1} \end{pmatrix}.}}}}} & (47) \end{matrix}$

Note that (43) holds since

${\ell_{m} = {{{0\mspace{14mu}{for}\mspace{14mu} m} > {\mu\mspace{14mu}{{and}\mspace{14mu}\left\lbrack {\begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix} - \begin{pmatrix} {d - k + 1} \\ {m + 1} \end{pmatrix}} \right\rbrack}}} = {{0\mspace{14mu}{for}\mspace{14mu} m} < 0}}},$ in (44) the techniques described herein used

_(m)=p_(μ-m) and some combinatorial manipulation to expand the coefficient, and (45) follows from four times evaluation of Lemma 2 for (a, b)=(0,0), (a, b)=(1,1), (a, b)=(−k, 0), and (a, b)=(−k+1,1). The equality in (46) holds since the terms in the third summation in (45) are zero except for m=0, and similarly the terms in the forth summation are zero except for m=−1,0. Finally, the second summation in (47) is absorbed in the first summation by noting that

${\begin{pmatrix} k \\ {- 1} \end{pmatrix} = 0},$ and the third summation is rewritten after a change of variable.

This section is dedicated to constructing an example of the proposed codes, and showing its fundamental properties. The techniques described herein may demonstrate all the ingredients of the construction, including encode matrix, code signature, concatenation of code segments, the grouping of the symbols in the lower (d−k) rows, and primary and secondary injection of v and w symbols.

Consider an (n, k=4, d=6; μ=4) code with parameters (α, β, F)=(81,27,324), as indicated by (3). Note that a code with parameters (α, β, F)=(81,27,324) is indeed an MSR code since F=kα and β=α/(d−k+1), for which several code constructions are known. However, while existing codes can be constructed for a given n (the number of nodes in the system) and node contents and parameters of the codes are functions of n, in the construction n is an arbitrary integer number, that only affects the field size (the field size may be greater than n). Nevertheless, this example is rich enough to demonstrate the techniques needed for the code construction as well as the formal proofs.

The first ingredient is an n×d encoder matrix with the properties in Definition 2. For the sake of illustration, the techniques described herein choose n=9 here, but the generalization of this encoder matrix to any integer n>d=6 is straightforward. The techniques described herein pick a Vandermonde matrix of size n×d=9×6. The underlying finite field may have at least n distinct elements. So, the techniques described herein pick

₁₃, and all the arithmetic operations below are performed in modulus 13.

$\Psi_{9 \times 6} = {\begin{bmatrix} \Psi_{1} \\ \Psi_{2} \\ \Psi_{3} \\ \Psi_{4} \\ \Psi_{5} \\ \Psi_{6} \\ \Psi_{7} \\ \Psi_{8} \\ \Psi_{9} \end{bmatrix} = {\begin{bmatrix} \psi_{1,1} & \psi_{1,2} & \psi_{1,3} & \psi_{1,4} & \psi_{1,5} & \psi_{1,6} \\ \psi_{2,1} & \psi_{2,2} & \psi_{2,3} & \psi_{2,4} & \psi_{2,5} & \psi_{2,6} \\ \psi_{3,1} & \psi_{3,2} & \psi_{3,3} & \psi_{3,4} & \psi_{3,5} & \psi_{3,6} \\ \psi_{4,1} & \psi_{4,2} & \psi_{4,3} & \psi_{4,4} & \psi_{4,5} & \psi_{4,6} \\ \psi_{5,1} & \psi_{5,2} & \psi_{5,3} & \psi_{5,4} & \psi_{5,5} & \psi_{5,6} \\ \psi_{6,1} & \psi_{6,2} & \psi_{6,3} & \psi_{6,4} & \psi_{6,5} & \psi_{6,6} \\ \psi_{7,1} & \psi_{7,2} & \psi_{7,3} & \psi_{7,4} & \psi_{7,5} & \psi_{7,6} \\ \psi_{8,1} & \psi_{8,2} & \psi_{8,3} & \psi_{8,4} & \psi_{8,5} & \psi_{8,6} \\ \psi_{9,1} & \psi_{9,2} & \psi_{9,3} & \psi_{9,4} & \psi_{9,5} & \psi_{9,6} \end{bmatrix} = {\quad{\left\lbrack \begin{matrix} 1 & 1 & 1 & 1 & 1 & 1 \\ 1 & 2 & 4 & 8 & 3 & 6 \\ 1 & 3 & 9 & 1 & 3 & 9 \\ 1 & 4 & 3 & 12 & 9 & 10 \\ 1 & 5 & 12 & 8 & 1 & 5 \\ 1 & 6 & 10 & 8 & 9 & 2 \\ 1 & 7 & 10 & 5 & 9 & 11 \\ 1 & 8 & 12 & 5 & 1 & 8 \\ 1 & 9 & 3 & 1 & 9 & 3 \end{matrix} \right\rbrack\mspace{11mu}{\left( {{mod}\mspace{11mu} 13} \right).}}}}}$

In order to design the super-message matrix M, the techniques described herein start with an (n, k=6, d=6; m=4). Throughout the construction, the techniques described herein may introduce child codes for each code segment until the techniques described herein complete all the injections, and provide a backup copy for every symbol in groups of

∪

of each segment message matrix. This leads to a concatenation of multiple signed determinant codes with various modes. The number of code segments at each mode can be found from (33), that is (

₄,

₃,

₂,

₁,

₀)=(1,0,3,2,9). Therefore, the resulting super-message matrix code M can be obtained from cascading a total of Σ_(m=0) ^(μ)

_(m)=15 code segments. For the sake of illustration the techniques described herein denote these code segments by T₀, T₁, . . . , T₁₄, that is, M=[T ₀ T ₁ . . . T ₁₄],  (48)

in which code segment T_(i) is the modified message matrix (after injection) of an (n, d, d; m_(i)) signed determinant code with mode m_(i)=mode(T_(i)), where (m ₀ ,m ₁ , . . . ,m ₁₄)=(4,2,2,2,1,1,0,0,0,0,0,0,0,0,0).

The techniques described herein also use superscript

i

to distinguish the data symbols of the code segment T_(i). The hierarchy of parents/children codes and symbol injection is shown in FIG. 7.

FIG. 7 is a conceptual diagram illustrating the hierarchical tree for an (n, k=4, d=6; μ=4) code. Each level on the tree shows codes with the same mode. The injection from the parent codes to child codes are shown by arrows, labeled by the corresponding injection pair.

The first code segment is a (d=6; m=4) signed determinant code, with message matrix T₀ and signature σ_(T) ₀ (x)=0 for every x∈[d], i.e., σ_(T) ₀ =(0,0,0,0,0,0). Note that no injection takes place into T₀, and hence, T₀=T₀, i.e., T₀ is a purely signed determinant message matrix of mode m₀=4. The size of this matrix is

${d \times \alpha_{m_{0}}} = {{d \times \begin{pmatrix} d \\ m_{0} \end{pmatrix}} = {{6 \times \begin{pmatrix} 6 \\ 4 \end{pmatrix}} = {6 \times 1{5.}}}}$ This matrix is given in (49).

$\begin{matrix} {\begin{matrix} {\left\{ {1,2,3,4} \right\}} & {\left\{ {1,2,3,5} \right\}} & \left\{ {1,2,3,6} \right\} & {\left\{ {1,2,4,5} \right\}} & {\left\{ {1,2,4,6} \right\}} & \left\{ {1,2,5,6} \right\} \end{matrix}{{\mathbb{T}}_{0} = {\begin{matrix} 1 \\ 2 \\ 3 \\ 4 \\ 5 \\ 6 \end{matrix}\left\lbrack \begin{matrix} v_{1,{\{{1,2,3,4}\}}}^{< 0 >} & v_{1,{\{{1,2,3,5}\}}}^{< 0 >} & v_{1,{\{{1,2,3,6}\}}}^{< 0 >} & \ldots & \ldots & v_{1,{\{{1,2,4,5}\}}}^{< 0 >} & v_{1,{\{{1,2,4,6}\}}}^{< 0 >} & v_{1,{\{{1,2,5,6}\}}}^{< 0 >} & \ldots & \ldots \\ v_{2,{\{{1,2,3,4}\}}}^{< 0 >} & v_{2,{\{{1,2,3,5}\}}}^{< 0 >} & v_{2,{\{{1,2,3,6}\}}}^{< 0 >} & \ldots & \ldots & v_{2,{\{{1,2,4,5}\}}}^{< 0 >} & v_{2,{\{{1,2,4,6}\}}}^{< 0 >} & v_{2,{\{{1,2,5,6}\}}}^{< 0 >} & \ldots & \ldots \\ v_{3,{\{{1,2,3,4}\}}}^{< 0 >} & v_{3,{\{{1,2,3,5}\}}}^{< 0 >} & v_{3,{\{{1,2,3,6}\}}}^{< 0 >} & \ldots & \ldots & w_{3,{\{{1,2,3,4,5}\}}}^{< 0 >} & w_{3,{\{{1,2,3,4,6}\}}}^{< 0 >} & w_{3,{\{{1,2,3,5,6}\}}}^{< 0 >} & \ldots & \ldots \\ v_{4,{\{{1,2,3,4}\}}}^{< 0 >} & w_{4,{\{{1,2,3,4,5}\}}}^{< 0 >} & w_{4,{\{{1,2,3,4,6}\}}}^{< 0 >} & \ldots & \ldots & v_{4,{\{{1,2,4,5}\}}}^{< 0 >} & v_{4,{\{{1,2,4,6}\}}}^{< 0 >} & w_{4,{\{{1,2,4,5,6}\}}}^{< 0 >} & \ldots & \ldots \\ w_{5,{\{{1,2,3,4,5}\}}}^{< 0 >} & v_{5,{\{{1,2,3,5}\}}}^{< 0 >} & w_{5,{\{{1,2,3,5,6}\}}}^{< 0 >} & \ldots & \ldots & v_{5,{\{{1,2,4,5}\}}}^{< 0 >} & w_{5,{\{{1,2,4,5,6}\}}}^{< 0 >} & v_{5,{\{{1,2,5,6}\}}}^{< 0 >} & \ldots & \ldots \\ w_{6,{\{{1,2,3,4,6}\}}}^{< 0 >} & w_{6,{\{{1,2,3,5,6}\}}}^{< 0 >} & v_{6,{\{{1,2,3,6}\}}}^{< 0 >} & \ldots & \ldots & w_{6,{\{{1,2,4,5,6}\}}}^{< 0 >} & v_{6,{\{{1,2,4,6}\}}}^{< 0 >} & v_{6,{\{{1,2,5,6}\}}}^{< 0 >} & \ldots & \ldots \end{matrix} \right.}}} & (49) \end{matrix}$ $\begin{matrix} {\left\{ {1,3,4,5} \right\}} & {\left\{ {1,3,4,6} \right\}} & \left\{ {1,3,5,6} \right\} & {\left\{ {1,4,5,6} \right\}} & {\left\{ {2,3,4,5} \right\}} & \left\{ {2,3,4,6} \right\} \end{matrix}\begin{matrix} v_{1,{\{{1,3,4,5}\}}}^{< 0 >} & v_{1,{\{{1,3,4,6}\}}}^{< 0 >} & v_{1,{\{{1,3,5,6}\}}}^{< 0 >} & \ldots & \ldots & v_{1,{\{{1,4,5,6}\}}}^{< 0 >} & w_{1,{\{{1,2,3,4,5}\}}}^{< 0 >} & w_{1,{\{{1,2,3,4,6}\}}}^{< 0 >} & \ldots & \ldots \\ w_{2,{\{{1,2,3,4,5}\}}}^{< 0 >} & w_{2,{\{{1,2,3,4,6}\}}}^{< 0 >} & w_{2,{\{{1,2,3,5,6}\}}}^{< 0 >} & \ldots & \ldots & v_{2,{\{{1,2,4,5,6}\}}}^{< 0 >} & v_{2,{\{{2,3,4,5}\}}}^{< 0 >} & v_{2,{\{{2,3,4,6}\}}}^{< 0 >} & \ldots & \ldots \\ v_{3,{\{{1,3,4,5}\}}}^{< 0 >} & v_{3,{\{{1,3,4,6}\}}}^{< 0 >} & v_{3,{\{{1,3,5,6}\}}}^{< 0 >} & \ldots & \ldots & w_{3,{\{{1,3,4,5,6}\}}}^{< 0 >} & v_{3,{\{{2,3,4,5}\}}}^{< 0 >} & v_{3,{\{{2,3,4,6}\}}}^{< 0 >} & \ldots & \ldots \\ v_{4,{\{{1,3,4,5}\}}}^{< 0 >} & v_{4,{\{{1,3,4,6}\}}}^{< 0 >} & w_{4,{\{{1,3,4,5,6}\}}}^{< 0 >} & \ldots & \ldots & v_{4,{\{{1,4,5,6}\}}}^{< 0 >} & v_{4,{\{{2,3,4,5}\}}}^{< 0 >} & v_{4,{\{{2,3,4,6}\}}}^{< 0 >} & \ldots & \ldots \\ v_{5,{\{{1,3,4,5}\}}}^{< 0 >} & w_{5,{\{{1,3,4,5,6}\}}}^{< 0 >} & v_{5,{\{{1,3,5,6}\}}}^{< 0 >} & \ldots & \ldots & w_{5,{\{{1,4,5,6}\}}}^{< 0 >} & v_{5,{\{{2,3,4,5}\}}}^{< 0 >} & w_{5,{\{{2,3,4,5,6}\}}}^{< 0 >} & \ldots & \ldots \\ w_{6,{\{{1,3,4,5,6}\}}}^{< 0 >} & v_{6,{\{{1,3,4,6}\}}}^{< 0 >} & v_{6,{\{{1,3,5,6}\}}}^{< 0 >} & \ldots & \ldots & v_{6,{\{{1,4,5,6}\}}}^{< 0 >} & w_{6,{\{{2,3,4,5,6}\}}}^{< 0 >} & v_{6,{\{{2,3,4,6}\}}}^{< 0 >} & \ldots & \ldots \end{matrix}$ $\left. {\begin{matrix} {\left\{ {2,3,5,6} \right\}} & {\left\{ {2,4,5,6} \right\}} & \left\{ {3,4,5,6} \right\} \end{matrix}\begin{matrix} w_{1,{\{{1,2,3,5,6}\}}}^{< 0 >} & w_{1,{\{{1,2,4,5,6}\}}}^{< 0 >} & w_{1,{\{{1,3,4,5,6}\}}}^{< 0 >} \\ v_{2,{\{{2,3,5,6}\}}}^{< 0 >} & v_{2,{\{{2,4,5,6}\}}}^{< 0 >} & w_{2,{\{{2,3,4,5,6}\}}}^{< 0 >} \\ v_{3,{\{{2,3,5,6}\}}}^{< 0 >} & w_{3,{\{{2,3,4,5,6}\}}}^{< 0 >} & v_{3,{\{{3,4,5,6}\}}}^{< 0 >} \\ w_{4,{\{{2,3,4,5,6}\}}}^{< 0 >} & v_{4,{\{{2,4,5,6}\}}}^{< 0 >} & v_{4,{\{{3,4,5,6}\}}}^{< 0 >} \\ v_{5,{\{{2,3,5,6}\}}}^{< 0 >} & v_{5,{\{{2,4,5,6}\}}}^{< 0 >} & v_{5,{\{{3,4,5,6}\}}}^{< 0 >} \\ v_{6,{\{{2,3,5,6}\}}}^{< 0 >} & v_{6,{\{{2,4,5,6}\}}}^{< 0 >} & v_{6,{\{{3,4,5,6}\}}}^{< 0 >} \end{matrix}} \right\rbrack$

Note that horizontal line in the matrix separates the top k=4 rows from the bottom (d−k)=6−4=2 rows. The top 4×15 sub-matrix is denoted by T₀ and the bottom 2×15 sub-matrix is denoted by T₀ .

According to Definition 3, the symbols in T₀ can be grouped as follows.

     𝒢₁(T₀) = ϕ ${{\mathcal{G}_{2}\left( T_{0} \right)} = \left\{ {w_{5,{\{{1,2,3,4,5}\}}}^{\langle 0\rangle}, w_{6,{\{{1,2,3,4,6}\}}}^{\langle 0\rangle}, w_{6,{\{{1,2,3,5,6}\}}}^{\langle 0\rangle}, w_{6,{\{{1,2,4,5,6}\}}}^{\langle 0\rangle}, w_{6,{\{{1,3,4,5,6}\}}}^{\langle 0\rangle}, w_{6,{\{{2,3,4,5,6}\}}}^{\langle 0\rangle}} \right\}},{{\mathcal{G}_{3}\left( T_{0} \right)} = \begin{Bmatrix} {v_{5,{\{{1,2,3,5}\}}}^{\langle 0\rangle},v_{5,{\{{1,2,4,5}\}}}^{\langle 0\rangle},v_{5,{\{{1,2,5,6}\}}}^{\langle 0\rangle},v_{5,{\{{1,3,4,5}\}}}^{\langle 0\rangle},v_{5,{\{{1,3,5,6}\}}}^{\langle 0\rangle},} \\ {v_{5,{\{{1,4,5,6}\}}}^{\langle 0\rangle},v_{5,{\{{2,3,4,5}\}}}^{\langle 0\rangle},v_{5,{\{{2,3,5,6}\}}}^{\langle 0\rangle},v_{5,{\{{2,{4_{,}5},6}\}}}^{\langle 0\rangle},v_{5,{\{{3,4,5,6}\}}}^{\langle 0\rangle},} \\ {v_{6,{\{{1,2,3,6}\}}}^{\langle 0\rangle},v_{6,{\{{1,2,4,6}\}}}^{\langle 0\rangle},v_{6,{\{{1,2,5,6}\}}}^{\langle 0\rangle},v_{6,{\{{1,3,4,6}\}}}^{\langle 0\rangle},v_{6,{\{{1,3,5,6}\}}}^{\langle 0\rangle},} \\ {v_{6,{\{{1,4,5,6}\}}}^{\langle 0\rangle},v_{6,{\{{2,3,4,6}\}}}^{\langle 0\rangle},v_{6,{\{{2,3,5,6}\}}}^{\langle 0\rangle},v_{6,{\{{2,4,5,6}\}}}^{\langle 0\rangle},v_{6,{\{{3,4,5,6}\}}}^{\langle 0\rangle}} \end{Bmatrix}},{{\mathcal{G}_{4}\left( T_{0} \right)} = {\left\{ {w_{5,{\{{1,2,3,5,6}\}}}^{\langle 0\rangle},w_{5,{\{{1,2,4,5,6}\}}}^{\langle 0\rangle},w_{5,{\{{1,3,4,5,6}\}}}^{\langle 0\rangle},w_{5,{\{{2,3,4,5,6}\}}}^{\langle 0\rangle}} \right\}.}}$

Since

(T₀)=ø, no symbol may be set to zero. Symbols in

(T₀) can be recovered from the parity equations. For instance, for w_(5,{1,2,3,4,5}) ^(<0>)∈

(T₀), from (7)−w_(1,{1,2,3,4,5}) ^(<0>)+w_(2,{1,2,3,4,5}) ^(<0>)−w_(3,{1,2,3,4,5}) ^(<0>)+w_(4,{1,2,3,4,5}) ^(<0>)−w_(5,{1,2,3,4,5}) ^(<0>)=0,

in which all the symbols except w_(5,{1,2,3,4,5}) ^(<0>) are located in the top k=4 rows of the matrix T₀.

The symbols in groups

(T₀) and

(T₀) are marked in boxes in (49), to indicate that they need to be injected into other code segments with lower modes. Moreover, two groups of injections are designated by colored boxes, namely, symbols in a first group of boxes may be injected into T₂ and those in a second group of boxes may be injected into T₅. The details of the injection are discussed in the following.

Consider symbol

∈

(T₀) with x=6 and

={1,2,5,6}, which implies

={1,2} and

={5,6}. According to (20), this symbol is primarily injected into a code of mode m=|

|−1=1, with injection pair (x,

)=(6, {5,6}). The row of the injection may be max

=max{1,2}=2 and its column is

\{max

}={1,2}\{2}={1}. Finally, the sign of the injection is given by

$\left( {- 1} \right)^{1 + \sigma_{{T_{0}({\max\overset{\_}{\mathcal{X}}})} + {{ind}_{\mathcal{X}}({\max\overset{\_}{\mathcal{X}}})}}} = {\left( {- 1} \right)^{1 + 0 + 2} = {\left( {- 1} \right)^{3} = {- 1.}}}$

This is formally written as

${\left\lbrack T_{0} \right\rbrack_{x,X} = {{v_{6,{\{{1,2,5,6}\}}}^{\langle 0\rangle}\overset{\times {({- 1})}}{\rightarrow}\left\lbrack T_{5_{\leftarrow T_{0}}^{6,{\{{5,6}\}}}} \right\rbrack_{2,{\{ 1\}}}} = {{\left( {- 1} \right)^{\sigma_{T_{5}}{(2)}}w_{2,{\{{1,2}\}}}^{({6,{\{{5,6}\}},T_{0}})}} = {\left( {- 1} \right)^{\sigma_{T_{5}}{(2)}}w_{2,{\{{1,2}\}}}^{\langle 5\rangle}}}}},$

that is, −v_(6,{1,2,5,6}) ^(<0>) may be added to the symbol at position (2, {1}) of the child code. This child code is originally a signed determinant code denoted by

$T_{5{\underset{\leftarrow}{6,{\{{5,6}\}}}}_{T_{0}}},$ into which (some of) the symbols of T₀ may be injected. Note that

$T_{5} = T_{5{\underset{\leftarrow}{6,{\{{5,6}\}}}}_{T_{0}}}$

is message matrix for a signed determinant code of mode 1 with the injection pair (6,{5,6}), and hence has

${{\begin{pmatrix} d \\ m \end{pmatrix} = {\begin{pmatrix} 6 \\ 1 \end{pmatrix} = 6}}\mspace{14mu}{columns}},$ and its columns are labeled with subsets of {1,2,3,4,5,6} of size 1. As a short-hand notation, the techniques described herein denote this message matrix before injection by T₅ and after injection by T₅, as indicated in FIG. 7. Then

$T_{5} = {T_{5} + {{\Delta_{\underset{\leftarrow}{6,{\{{5,6}\}}}}}_{T_{0}}.}}$ The signature of this child code can be found from (17) as σ_(T) ₅ =(2,2,2,2,2,3).  (50)

In summary, the primary injection of this symbol is given by [T ₅]_(2,{1}) =w _(2,{1,2}) ^(<5>) −v _(6,{1,2,5,6}) ^(<0>).

The complete form of matrices

T 5 ⁢ 6 , { 5 , 6 } ← T 0 ⁢ and ⁢ Δ 6 , { 5 , 6 } ← T 0 are given in (51) and (52).

$\begin{matrix} {\begin{matrix} {\left\{ 1 \right\}} & {\left\{ 2 \right\}} & {\left\{ 3 \right\}} & {\left\{ 4 \right\}} & {\left\{ 5 \right\}} & {\left\{ 6 \right\}} \end{matrix}{{\mathbb{T}}_{5} = {\begin{matrix} 1 \\ 2 \\ 3 \\ 4 \\ 5 \\ 6 \end{matrix}\begin{bmatrix} v_{1,{\{ 1\}}}^{< 5 >} & w_{1,{\{{1,2}\}}}^{< 5 >} & w_{1,{\{{1,3}\}}}^{< 5 >} & \ldots & \ldots & w_{1,{\{{1,4}\}}}^{< 5 >} & w_{1,{\{{1,5}\}}}^{< 5 >} & w_{1,{\{{1,6}\}}}^{< 5 >} \\ w_{2,{\{{1,2}\}}}^{< 5 >} & v_{2,{\{ 2\}}}^{< 5 >} & w_{2,{\{{2,3}\}}}^{< 5 >} & \ldots & \ldots & w_{2,{\{{2,4}\}}}^{< 5 >} & w_{2,{\{{2,5}\}}}^{< 5 >} & w_{2,{\{{2,6}\}}}^{< 5 >} \\ w_{3,{\{{1,3}\}}}^{< 5 >} & w_{3,{\{{2,3}\}}}^{< 5 >} & v_{3,{\{ 3\}}}^{< 5 >} & \ldots & \ldots & w_{3,{\{{3,4}\}}}^{< 5 >} & w_{3,{\{{3,5}\}}}^{< 5 >} & w_{3,{\{{3,6}\}}}^{< 5 >} \\ w_{4,{\{{1,4}\}}}^{< 5 >} & w_{4,{\{{2,4}\}}}^{< 5 >} & w_{4,{\{{3,4}\}}}^{< 5 >} & \ldots & \ldots & v_{4,{\{ 4\}}}^{< 5 >} & w_{4,{\{{4,5}\}}}^{< 5 >} & w_{4,{\{{4,6}\}}}^{< 5 >} \\ w_{5,{\{{1,5}\}}}^{< 5 >} & w_{5,{\{{2,5}\}}}^{< 5 >} & w_{5,{\{{3,5}\}}}^{< 5 >} & \ldots & \ldots & w_{5,{\{{4,5}\}}}^{< 5 >} & {v_{5,{\{ 5\}}}^{< 5 >} = 0} & {w_{5,{\{{5,6}\}}}^{< 5 >} = 0} \\ {- w_{6,{\{{1,6}\}}}^{< 5 >}} & {- w_{6,{\{{2,6}\}}}^{< 5 >}} & {- w_{6,{\{{3,6}\}}}^{< 5 >}} & \ldots & \ldots & {- w_{6,{\{{4,6}\}}}^{< 5 >}} & {{- w_{6,{\{{5,6}\}}}^{< 5 >}} = 0} & {{- v_{6,{\{ 6\}}}^{< 5 >}} = 0} \end{bmatrix}}}} & (51) \end{matrix}$ $\begin{matrix} {\begin{matrix} {\left\{ 1 \right\}} & {\left\{ 2 \right\}} & {\left\{ 3 \right\}} & {\left\{ 4 \right\}\left\{ 5 \right\}\left\{ 6 \right\}} \end{matrix}{{\overset{\Delta_{6,{\{{5,6}\}}}}{\leftarrow}{\mathbb{T}}_{0}} = {\begin{matrix} 1 \\ 2 \\ 3 \\ 4 \\ 5 \\ 6 \end{matrix}\begin{bmatrix} 0 & 0 & 0 & 0 & 0 & 0 \\ {- v_{6,{\{{1,2,5,6}\}}}^{< 0 >}} & 0 & 0 & 0 & 0 & 0 \\ {- v_{6,{\{{1,3,5,6}\}}}^{< 0 >}} & {- v_{6,{\{{2,3,5,6}\}}}^{< 0 >}} & 0 & 0 & 0 & 0 \\ {- v_{6,{\{{1,4,5,6}\}}}^{< 0 >}} & {- v_{6,{\{{2,4,5,6}\}}}^{< 0 >}} & {- v_{6,{\{{3,4,5,6}\}}}^{< 0 >}} & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \end{bmatrix}}}} & (52) \end{matrix}$

As it is clear from (52), the group of symbols {v_(6,{1,2,5,6}) ^(<0>), v_(6,{1,3,5,6}) ^(<0>), v_(6,{1,4,5,6}) ^(<0>), v_(6,{2,3,5,6}) ^(<0>), v_(6,{2,4,5,6}) ^(<0>), v_(6,{3,4,5,6}) ^(<0>)} of

(T₀) may be all primarily injected into the symbols of the T₅. Note that all the primary injections are performed in T₅ . Similarly, the symbols {v_(5,{1,2,5,6}) ^(<0>), v_(5,{1,3,5,6}) ^(<0>), v_(5,{1,4,5,6}) ^(<0>), v_(5,{2,3,5,6}) ^(<0>), v_(5,{2,4,5,6}) ^(<0>), v_(5,{3,4,5,6}) ^(<0>)} may be injected into

${T_{4} = T_{4{\underset{\leftarrow}{5,{\{{5,6}\}}}}_{T_{0}}}},$ another child code of T₀ with injection pair (5, {5,6}).

Note that the entries in the last row of

$T_{5{\underset{\leftarrow}{6,{\{{5,6}\}}}}_{T_{0}}}$ in (51) have negative sign, due to (50). Moreover, from Definition 3

${{\mathcal{G}_{1}\left( T_{5} \right)} = \left\{ {v_{5,{\{ 5\}}}^{\langle 5\rangle},{- v_{6,{\{ 6\}}}^{\langle 5\rangle}},w_{5,{\{{5,6}\}}}^{\langle 5\rangle},{- w_{6,{\{{5,6}\}}}^{\langle 5\rangle}},} \right\}},{{\mathcal{G}_{2}\left( T_{5} \right)} = \begin{Bmatrix} {w_{5,{\{{1,5}\}}}^{\langle 5\rangle},w_{5,{\{{2,5}\}}}^{\langle 5\rangle},w_{5,{\{{3,5}\}}}^{\langle 5\rangle},w_{5,{\{{4,5}\}}}^{\langle 5\rangle},} \\ {{- w_{6,{\{{1,6}\}}}^{\langle 5\rangle}},{- w_{6,{\{{2,6}\}}}^{\langle 5\rangle}},{- w_{6,{\{{3,6}\}}}^{\langle 5\rangle}},{- w_{6,{\{{4,6}\}}}^{\langle 5\rangle}}} \end{Bmatrix}},{{\mathcal{G}_{3}\left( T_{5} \right)} = {{\mathcal{G}_{4}\left( T_{5} \right)} = {\phi.}}}$ The symbols in

₁(T₅) are marked in (51), and set to zero. It is worth mentioning that since

₃(T₅)=

₄(T₅)=ø, no further injection from T₅ is needed, and hence T₅ does not have any child (see FIG. 7).

Beside its primary injection to T₅, the symbols in

₃(T₀) are also subject to secondary injection(s). Let us consider v_(6,{1,2,5,6}) ^(<0>). According to (21), a secondary injection of v_(6,{1,2,5,6)}^(<0>) is determined by an integer y∈

={5,6} and subsets (

,

):

For y=5,

_([k+1:y−1])=

_([5:4])=ø. Hence

=

=ø and x=6≤max(

_([y+1:d])∪

)=max(

_([6:6])∪ø)=6 is satisfied. Hence this injection is needed.

If y=6, then

_([k+1:y−1])=

_([5:5])={5}. Hence, either (

,

)=(ø, {5}) or (

,

)=({5}, ø). However, since

_([y+1:d])=

_([7:5])=ø, the condition x=6≤max(

_([y+1:d])∪

) cannot be satisfied. Thus, there is no injection for y=6.

For the only secondary injection satisfying conditions of (21), i.e., y=5 and

=

=ø, the injection pair is given by (x,

_([y+1:d])∪

)=(x,

_([6:6])∪ø)=(6,{6}),

and the mode of the child code is m=|

∪

|=|{1,2}∪ø|=2.

This code is denoted by T₂ in FIG. 7. Hence,

$\left\lbrack T_{0} \right\rbrack_{x,X} = {{v_{6,{\{{1,2,5,6}\}}}^{\langle 0\rangle}\overset{\times {({- 1})}^{1 + {\sigma_{T_{0}}{(5)}} + {{ind}_{\{{1,2,5,6}\}}{(5)}}}}{\rightarrow}\left\lbrack T_{2_{\leftarrow T_{0}}^{6,{\{ 6\}}}} \right\rbrack_{5,{\{{1,2}\}}}} = {\left( {- 1} \right)^{\sigma_{T_{2}}{(5)}}{w_{5,{\{{1,2,5}\}}}^{({6,{\{ 6\}},T_{0}})}.}}}$

Recall that T₂ is a code of mode

${m_{2} = {{2\mspace{14mu}{with}\mspace{14mu}\begin{pmatrix} d \\ m_{2} \end{pmatrix}} = {\begin{pmatrix} 6 \\ 2 \end{pmatrix} = {15\mspace{14mu}{columns}}}}},$ columns, each labeled by a subset of {1, . . . ,6} of size 2. The signature of T₂ can be obtained from (17) as σ_(T) ₂ (i)=1+σ_(T) ₀ (i)+ind_({6}∪{i})(i)=2∀i∈{1,2,3,4,5,6}.

The complete representation of the message matrix

T₂ = T_(2_( ← T₀)^(6, {6})) is given in (53).

$\begin{matrix} {\begin{matrix} {\left\{ {1,2} \right\}} & {\left\{ {1,3} \right\}} & {\left\{ {1,4} \right\}} & {\left\{ {1,5} \right\}} & {\left\{ {1,6} \right\}} & {\left\{ {2,3} \right\}} \end{matrix}{{\mathbb{T}}_{2} = {\begin{matrix} 1 \\ 2 \\ 3 \\ 4 \\ 5 \\ 6 \end{matrix}\left\lbrack \begin{matrix} v_{1,{\{{1,2}\}}}^{< 2 >} & v_{1,{\{{1,3}\}}}^{< 2 >} & v_{1,{\{{1,4}\}}}^{< 2 >} & \ldots & \ldots & v_{1,{\{{1,5}\}}}^{< 2 >} & v_{1,{\{{1,6}\}}}^{< 2 >} & w_{1,{\{{1,2,3}\}}}^{< 2 >} & \ldots & \ldots \\ v_{2,{\{{1,2}\}}}^{< 2 >} & w_{2,{\{{1,2,3}\}}}^{< 2 >} & w_{2,{\{{1,2,4}\}}}^{< 2 >} & \ldots & \ldots & w_{2,{\{{1,2,5}\}}}^{< 2 >} & w_{2,{\{{1,2,6}\}}}^{< 2 >} & v_{2,{\{{2,3}\}}}^{< 2 >} & \ldots & \ldots \\ w_{3,{\{{1,2,3}\}}}^{< 2 >} & v_{3,{\{{1,3}\}}}^{< 2 >} & w_{3,{\{{1,3,4}\}}}^{< 2 >} & \ldots & \ldots & w_{3,{\{{1,3,5}\}}}^{< 2 >} & w_{3,{\{{1,3,6}\}}}^{< 2 >} & v_{3,{\{{2,3}\}}}^{< 2 >} & \ldots & \ldots \\ w_{4,{\{{1,2,4}\}}}^{< 2 >} & w_{4,{\{{1,3,4}\}}}^{< 2 >} & v_{4,{\{{1,4}\}}}^{< 2 >} & \ldots & \ldots & w_{4,{\{{1,4,5}\}}}^{< 2 >} & w_{4,{\{{1,4,6}\}}}^{< 2 >} & w_{4,{\{{2,3,4}\}}}^{< 2 >} & \ldots & \ldots \\ w_{5,{\{{1,2,5}\}}}^{< 2 >} & w_{5,{\{{1,3,5}\}}}^{< 2 >} & w_{5,{\{{1,4,5}\}}}^{< 2 >} & \ldots & \ldots & v_{5,{\{{1,5}\}}}^{< 2 >} & w_{5,{\{{1,5,6}\}}}^{< 2 >} & w_{5,{\{{2,3,5}\}}}^{< 2 >} & \ldots & \ldots \\ w_{6,{\{{1,2,6}\}}}^{< 2 >} & w_{6,{\{{1,3,6}\}}}^{< 2 >} & w_{6,{\{{1,4,6}\}}}^{< 2 >} & \ldots & \ldots & w_{6,{\{{1,5,6}\}}}^{< 2 >} & v_{6,{\{{1,6}\}}}^{< 2 >} & w_{6,{\{{2,3,6}\}}}^{< 2 >} & \ldots & \ldots \end{matrix} \right.}}} & (53) \end{matrix}$ $\begin{matrix} {\left\{ {2,4} \right\}} & {\left\{ {2,5} \right\}} & {\left\{ {2,6} \right\}} & {\left\{ {3,4} \right\}} & {\left\{ {3,5} \right\}} & {\left\{ {3,6} \right\}} \end{matrix}\begin{matrix} w_{1,{\{{1,2,4}\}}}^{< 2 >} & w_{1,{\{{1,2,5}\}}}^{< 2 >} & w_{1,{\{{1,2,6}\}}}^{< 2 >} & \ldots & \ldots & w_{1,{\{{1,3,4}\}}}^{< 2 >} & w_{1,{\{{1,3,5}\}}}^{< 2 >} & w_{1,{\{{1,3,6}\}}}^{< 2 >} & \ldots & \ldots \\ v_{2,{\{{2,4}\}}}^{< 2 >} & v_{2,{\{{2,5}\}}}^{< 2 >} & v_{2,{\{{2,6}\}}}^{< 2 >} & \ldots & \ldots & w_{2,{\{{2,3,4}\}}}^{< 2 >} & w_{2,{\{{2,3,5}\}}}^{< 2 >} & w_{2,{\{{2,3,6}\}}}^{< 2 >} & \ldots & \ldots \\ w_{3,{\{{2,3,4}\}}}^{< 2 >} & w_{3,{\{{2,3,5}\}}}^{< 2 >} & w_{3,{\{{2,3,6}\}}}^{< 2 >} & \ldots & \ldots & v_{3,{\{{3,4}\}}}^{< 2 >} & v_{3,{\{{3,5}\}}}^{< 2 >} & v_{3,{\{{3,6}\}}}^{< 2 >} & \ldots & \ldots \\ v_{4,{\{{2,4}\}}}^{< 2 >} & w_{4,{\{{2,4,5}\}}}^{< 2 >} & w_{4,{\{{2,4,6}\}}}^{< 2 >} & \ldots & \ldots & v_{4,{\{{3,4}\}}}^{< 2 >} & w_{4,{\{{3,4,5}\}}}^{< 2 >} & w_{4,{\{{3,4,6}\}}}^{< 2 >} & \ldots & \ldots \\ w_{5,{\{{2,4,5}\}}}^{< 2 >} & v_{5,{\{{2,5}\}}}^{< 2 >} & w_{5,{\{{2,5,6}\}}}^{< 2 >} & \ldots & \ldots & w_{5,{\{{3,4,5}\}}}^{< 2 >} & v_{5,{\{{3,5}\}}}^{< 2 >} & w_{5,{\{{3,5,6}\}}}^{< 2 >} & \ldots & \ldots \\ w_{6,{\{{2,4,6}\}}}^{< 2 >} & w_{6,{\{{2,5,6}\}}}^{< 2 >} & v_{6,{\{{2,6}\}}}^{< 2 >} & \ldots & \ldots & w_{6,{\{{3,4,6}\}}}^{< 2 >} & w_{6,{\{{3,5,6}\}}}^{< 2 >} & v_{6,{\{{3,6}\}}}^{< 2 >} & \ldots & \ldots \end{matrix}$ $\left. {\begin{matrix} {\left\{ {4,5} \right\}} & {\left\{ {4,6} \right\}} & {\left\{ {5,6} \right\}} \end{matrix}\begin{matrix} w_{1,{\{{1,4,5}\}}}^{< 2 >} & w_{1,{\{{1,4,6}\}}}^{< 2 >} & w_{1,{\{{1,5,6}\}}}^{< 2 >} \\ w_{2,{\{{2,4,5}\}}}^{< 2 >} & w_{2,{\{{2,4,6}\}}}^{< 2 >} & w_{2,{\{{2,5,6}\}}}^{< 2 >} \\ w_{3,{\{{3,4,5}\}}}^{< 2 >} & w_{3,{\{{3,4,6}\}}}^{< 2 >} & w_{3,{\{{3,5,6}\}}}^{< 2 >} \\ v_{4,{\{{4,5}\}}}^{< 2 >} & v_{4,{\{{4,6}\}}}^{< 2 >} & w_{4,{\{{4,5,6}\}}}^{< 2 >} \\ v_{5,{\{{4,5}\}}}^{< 2 >} & w_{5,{\{{4,5,6}\}}}^{< 2 >} & {v_{5,{\{{5,6}\}}}^{< 2 >} = 0} \\ w_{6,{\{{4,5,6}\}}}^{< 2 >} & v_{6,{\{{4,6}\}}}^{< 2 >} & {v_{6,{\{{5,6}\}}}^{< 2 >} = 0} \end{matrix}} \right\rbrack$

The modified version of this signed determinant code is given by

$T_{2} = {T_{2_{\leftarrow T_{0}}^{6{\{ 6\}}}} = {T_{2_{\leftarrow T_{0}}^{6{\{ 6\}}}} + {\Delta_{\underset{\leftarrow T_{0}}{6,{\{ 6\}}}}.}}}$

In summary, the secondary injection of v_(6,{1,2,5,6}) ^(<0>) is given by [T ₂]_(5,{1,2}) =w _(5,{1,2,5}) ^((6,{6},T) ⁰ ⁾ +v _(2,{1,2,5,6}) ^(<0>) =w _(5,{1,2,5}) ^(<2>) +v _(6,{1,2,5,6}) ^(<0>).

It is very important to mention that the child code T₂ is initially introduced for the primary injection of symbols {v _(6,{1,2,5,6}) ^(<0>) ,v _(6,{1,2,4,6}) ^(<0>) ,v _(6,{1,3,4,6}) ^(<0>) ,v _(6,{2,3,4,6}) ^(<0>)}⊆

(T ₀),

while it is also used for secondary injection of some other symbols including v_(6,{1,2,5,6}) ^(<0>). For instance, followed from (20), the primary injection of v_(6,{1,2,3,6}) ^(<0>) with

$\mspace{20mu}{{x = 6},{\overset{¯}{X} = {{\left\{ {1,2,3} \right\}\mspace{14mu}{and}\mspace{14mu}\underset{¯}{X}} = {{\left\{ 6 \right\}\mspace{14mu}{is}\mspace{14mu}{given}\mspace{14mu}{{by}\left\lbrack T_{0} \right\rbrack}_{x,X}} = {{v_{6_{,}{\{{1,2,3,6}\}}}^{\langle 0\rangle}\overset{\times {({- 1})}^{1 + {\sigma_{T_{0}}{(3)}} + {{{in}d}_{\{{1,2,3,6}\}}{(3)}}}}{\rightarrow}\left\lbrack T_{2_{\leftarrow T_{0}}^{6,{\{ 6\}}}} \right\rbrack_{3,{\{{1,2}\}}}} = {\left( {- 1} \right)^{\sigma_{T_{2}}{(3)}}w_{3,{\{{1,2,3}\}}}^{({{2;6},{\{ 6\}},T_{0}})}}}}}},}$

which is performed into the same child code T₂. The matrix representing all the injections into T₂ is given in (54). Note that all the primary injections are performed into T₂ , and the secondary injections take place in T₂ .

$\begin{matrix} {{\begin{matrix} {\left\{ {1,2} \right\}} & {\left\{ {1,3} \right\}} & {\left\{ {1,4} \right\}} & {\left\{ {1,5} \right\}\left\{ {1,6} \right\}} \end{matrix}\begin{matrix} {\left\{ {2,3} \right\}} & {\left\{ {2,4} \right\}} & {\left\{ {2,5} \right\}\left\{ {2,6} \right\}} \end{matrix}\left\{ {3,4} \right\}}{{\overset{\Delta_{6,{\{ 6\}}}}{\leftarrow}{\mathbb{T}}_{0}} = {\begin{matrix} 1 \\ 2 \\ 3 \\ 4 \\ 5 \\ 6 \end{matrix}\left\lbrack \begin{matrix} 0 & 0 & 0 & 0 & 0 & \ldots & \ldots & 0 & 0 & 0 & 0 & 0 & \ldots & \ldots \\ 0 & 0 & 0 & 0 & 0 & \ldots & \ldots & 0 & 0 & 0 & 0 & 0 & \ldots & \ldots \\ v_{6,{\{{1,2,3,6}\}}}^{< 0 >} & 0 & 0 & 0 & 0 & \ldots & \ldots & 0 & 0 & 0 & 0 & 0 & \ldots & \ldots \\ v_{6,{\{{1,2,4,6}\}}}^{< 0 >} & v_{6,{\{{1,3,4,6}\}}}^{< 0 >} & 0 & 0 & 0 & \ldots & \ldots & v_{6,{\{{2,3,4,6}\}}}^{< 0 >} & 0 & 0 & 0 & 0 & \ldots & \ldots \\ v_{6,{\{{1,2,5,6}\}}}^{< 0 >} & v_{6,{\{{1,3,5,6}\}}}^{< 0 >} & v_{6,{\{{1,4,5,6}\}}}^{< 0 >} & 0 & 0 & \ldots & \ldots & v_{6,{\{{2,3,5,6}\}}}^{< 0 >} & v_{6,{\{{2,4,5,6}\}}}^{< 0 >} & 0 & 0 & v_{6,{\{{3,4,5,6}\}}}^{< 0 >} & \ldots & \ldots \\ 0 & 0 & 0 & 0 & 0 & \ldots & \ldots & 0 & 0 & 0 & 0 & 0 & \ldots & \ldots \end{matrix} \right.}}} & (54) \end{matrix}$ $\left. {\begin{matrix} \left\{ {3,5} \right\} & \left\{ {3,6} \right\} & \left\{ {4,5} \right\} & \left\{ {4,6} \right\} & \left\{ {5,6} \right\} \end{matrix}\begin{matrix} 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \end{matrix}} \right\rbrack$

Finally, according to Definition 3, the symbols in T₂ can be partitioned to

$\begin{matrix} {{{\mathcal{G}_{1}\left( T_{2} \right)} = \left\{ {v_{5,{\{{5,6}\}}}^{\langle 2\rangle},v_{6,{\{{5,6}\}}}^{\langle 2\rangle}} \right\}},{{\mathcal{G}_{2}\left( T_{2} \right)} = \begin{Bmatrix} {w_{5,{\{{1,2,5}\}}}^{\langle 2\rangle},w_{5,{\{{1,3,5}\}}}^{\langle 2\rangle},w_{5,{\{{1,4,5}\}}}^{\langle 2\rangle},w_{5,{\{{2,3,5}\}}}^{\langle 2\rangle},w_{5,{\{{2,4,5}\}}}^{\langle 2\rangle},w_{5,{\{{3,4,5}\}}}^{\langle 2\rangle},w_{6,{\{{1,2,6}\}}}^{\langle 2\rangle},w_{6,{\{{1,3,6}\}}}^{\langle 2\rangle},} \\ {w_{6,{\{{1,4,6}\}}}^{\langle 2\rangle},w_{6,{\{{1,5,6}\}}}^{\langle 2\rangle},w_{6,{\{{2,3,6}\}}}^{\langle 2\rangle},w_{6,{\{{2,4,6}\}}}^{\langle 2\rangle},w_{6,{\{{2,5,6}\}}}^{\langle 2\rangle},w_{6,{\{{3,4,6}\}}}^{\langle 2\rangle},w_{6,{\{{3,5,6}\}}}^{\langle 2\rangle},w_{6,{\{{4,5,6}\}}}^{\langle 2\rangle}} \end{Bmatrix}},{{\mathcal{G}_{3}\left( T_{2} \right)} = \left\{ {v_{5,{\{{1,5}\}}}^{\langle 2\rangle},v_{5,{\{{2,5}\}}}^{\langle 2\rangle},v_{5,{\{{3,5}\}}}^{\langle 2\rangle},v_{5,{\{{4,5}\}}}^{\langle 2\rangle},v_{6,{\{{1,6}\}}}^{\langle 2\rangle},v_{6,{\{{2,6}\}}}^{\langle 2\rangle},v_{6,{\{{3,6}\}}}^{\langle 2\rangle},v_{6,{\{{4,6}\}}}^{\langle 2\rangle}} \right\}},{{\mathcal{G}_{4}\left( T_{2} \right)} = {\left\{ {w_{5,{\{{1,5,6}\}}}^{\langle 2\rangle},w_{5,{\{{2,5,6}\}}}^{\langle 2\rangle},w_{5,{\{{3,5,6}\}}}^{\langle 2\rangle},w_{5,{\{{4,5,6}\}}}^{\langle 2\rangle}} \right\}.}}} & (55) \end{matrix}$

The code segment T₂ has 3 child codes, namely, T₉, T₁₀, T₁₁. For instance, according to (22), the primary injection of w_(5,{2,5,6}) ^(<2>)∈

(T₂) with x=5 and

={2,6} takes place into a code of mode 0 with injection pair (5, {6}). This child code is called T₁₁ in FIG. 7. Therefore,

$\left\lbrack T_{2} \right\rbrack_{5,{\{{2,6}\}}} = {{{\left( {- 1} \right)^{\sigma_{T_{2}}{(5)}}w_{5,{\{{2,5,6}\}}}^{\langle 2\rangle}}\overset{\times {({- 1})}^{1 + {\sigma_{T_{2}}{(2)}} + {{{in}d}_{\{{2,6}\}}{(2)}}}}{\rightarrow}\left\lbrack T_{11_{\leftarrow T_{2}}^{5,{\{ 6\}}}} \right\rbrack_{2,\phi}} = {{\left( {- 1} \right)^{\sigma_{T_{11}}{(2)}}w_{2,\phi}^{({5,{\{ 6\}},T_{2}})}} = 0.}}$

Recall that for the code segment T₁₁ with mode(T₁₁)=0, all the entries in the message matrix (before injection) are zero, as given in (56). Therefore the modified code is obtained by

$T_{11} = {{T_{11} + \Delta_{\underset{\leftarrow T_{2}}{5{\{ 6\}}}}} = {\Delta_{\underset{\leftarrow T_{2}}{5{\{ 6\}}}}.}}$ The injection matrix

$\Delta_{\underset{\leftarrow T_{2}}{5{\{ 6\}}}}$ is also given in (56).

$\begin{matrix} {\begin{matrix} \varnothing & {\varnothing} \end{matrix}{{\mathbb{T}}_{11} = {{{\begin{matrix} 1 \\ 2 \\ 3 \\ 4 \\ 5 \\ 6 \end{matrix}\begin{bmatrix} 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \end{bmatrix}}\overset{\Delta_{,{5{\{ 6\}}}}}{\leftarrow}{\mathbb{T}}_{2}} = {\begin{matrix} 1 \\ 2 \\ 3 \\ 4 \\ 5 \\ 6 \end{matrix}\begin{bmatrix} w_{5,{\{{1,5,6}\}}}^{< 2 >} \\ w_{5,{\{{2,5,6}\}}}^{< 2 >} \\ w_{5,{\{{3,5,6}\}}}^{< 2 >} \\ w_{5,{\{{4,5,6}\}}}^{< 2 >} \\ 0 \\ 0 \end{bmatrix}}}}} & (56) \end{matrix}$

The super-message matrix M may be obtained by concatenating all the code segments, as given in (48). Finally, the code may be obtained by multiplying this super-message matrix by the encoder matrix Ψ, i.e.,

=Ψ·M, and the i-the row of

may be stored in node i.

Consider the data recovery from an arbitrary subset of k=4 nodes, say nodes in

={3,5,7,8}. By downloading and stacking the content of nodes in

, the techniques described herein obtain Ψ[

, :]·M. Here Ψ[

, :] is the k×d sub-matrix of Ψ consisting of rows indexed by i∈

. Unlike the (n,k=d,d) signed determinant codes, this matrix is not square, and hence is not invertible. So, the techniques described herein cannot simply multiply retrieve M from Ψ[

, :]·M. Nevertheless, using properties of the encoder matrix in Definition 2, Ψ[

, :] can be decomposed to Ψ[

, :]=[Γ[

, :]|Υ[

, :]], where Γ[

, :] is an invertible matrix. Multiplying the Ψ[

, :]·M matrix by Γ[

, :]⁻¹,

$\begin{matrix} \begin{matrix} {{{\Gamma\left\lbrack {\mathcal{K},\text{:}} \right\rbrack}^{- 1} \cdot \left( {\Psi_{\mathcal{K}} \cdot M} \right)} = {{\Gamma\left\lbrack {\mathcal{K},\text{:}} \right\rbrack}^{- 1} \cdot \left\lbrack {\Gamma\left\lbrack {\mathcal{K},\text{:}} \right\rbrack} \middle| {\Upsilon\left\lbrack {\mathcal{K},\text{:}} \right\rbrack} \right\rbrack \cdot M}} \\ {= {\left\lbrack I_{k \times k} \middle| {{\Gamma\left\lbrack {\mathcal{K},\text{:}} \right\rbrack}^{- 1}{\Upsilon\left\lbrack {\mathcal{K},\text{:}} \right\rbrack}} \right\rbrack \cdot}} \\ {\begin{bmatrix} \overset{\_}{T_{0}} & \overset{\_}{T_{1}} & \ldots & \overset{\_}{T_{14}} \\ \underset{\_}{T_{0}} & \underset{\_}{T_{1}} & \ldots & \underset{\_}{T_{14}} \end{bmatrix}} \\ {= {\begin{matrix} \begin{matrix} \begin{matrix} \left\lbrack {\overset{\_}{T_{0}} + {{{\Gamma\left\lbrack {\mathcal{K},\text{:}} \right\rbrack}^{- 1} \cdot {\Upsilon\left\lbrack {\mathcal{K},\text{:}} \right\rbrack}}\ \underset{\_}{T_{0}}}}\  \right. \\ {\overset{\_}{T_{1}} + {\Gamma\;{{\Upsilon\left\lbrack {\mathcal{K},\text{:}} \right\rbrack}^{- 1} \cdot {\Upsilon\left\lbrack {\mathcal{K},\text{:}} \right\rbrack} \cdot \ \underset{\_}{T_{1}}}}} \end{matrix} \\ \ldots \end{matrix} \\ \left. {\overset{\_}{T_{14}} + {{\Gamma\left\lbrack {\mathcal{K},\text{:}} \right\rbrack}^{- 1} \cdot {\Upsilon\left\lbrack {\mathcal{K},\text{:}} \right\rbrack} \cdot \ \underset{\_}{T_{14}}}} \right\rbrack \end{matrix}.}} \end{matrix} & (57) \end{matrix}$

The ultimate goal is to recover all entries of M from this equation.

The techniques described herein start with code segments at the lower level of the injection tree in FIG. 7, i.e., code segments with mode zero, namely, T₆, . . . , T₁₄. Note that T₆ =T₇ = . . . =T₁₄ =0, since no injection takes place in the bottom part message matrices of mode m=0 (for instance see

$\Delta_{{\underset{\leftarrow}{5,{\{ 6}}\}}_{T_{2}}}$ in (56)). Therefore, T _(i) +Γ[

,:]⁻¹·Υ[

,:]· T _(i) = T _(i) +Γ[

,:]⁻¹·Υ[

,:]·0= T _(i) ,

for i=6, . . . ,14, which implies the top parts T_(i) for i=16, . . . ,14 can be retrieved from (57).

Next, the techniques described herein decode the message matrix of code segments with mode 1. Without loss of generality, consider T₅. Recall from (51) and (52) that [T₅]_(5,{5})=[T₅]_(5,{6)}=[T₅]_(6,{5})=[T₅]_(6,{6})=0. That is, the bottom parts of columns {5} and {6} of T₅ indicated by are zero, and hence, the top parts of these columns can be recovered from (57). Then the techniques described herein can use the parity equation (7) to recover the remaining symbols in T₅ :w_(5,{1,5}) ^(<5>)=w_(1,{1,5}) ^(<5>), w_(5,{2,5}) ^(<5>)=w_(2,{2,5}) ^(<5>), etc. Once T₅ is fully decoded, the techniques described herein can remove its contribution from T₅ +Γ[

, :]⁻¹·Υ[

, :]·T₅ , and recover entries of T₅ . Note that T₄ can be decoded in a similar fashion.

The next step consists of decoding message matrices of code segments with mode 2, i.e., T₁, T₂, and T₃. Here the techniques described herein focus on decoding T₂ for the sake of illustration. First, recall the partitioning of symbols in T₂ given in (55), and the fact that symbols in

(T₂) are zero. Moreover, symbols in

(T₂)∪

(T₂) are injected into code segments T₉, T₁₀, and T₁₁, and can be recovered from the decoding of the lower mode codes. Therefore, the bottom parts of columns {1,6}, {2,6}, {3,6}, {4,6}, and {5,6} are known. From the bottom part and the collected information for data recovery T₂ +Γ[

, :]⁻¹·Υ[

, :]·T₂ the techniques described herein can also decode the top part of these columns. The techniques described herein scan the columns of T₂ (in (53) and (54)) from right to left, to find the first not-yet-decoded column of T₂, that is {4,5}. Note that the entry of T₂ at position (6, {4,5}) is given by

$\left\lbrack T_{2} \right\rbrack_{6,{\{{4,5}\}}} = {\left\lbrack T_{2_{\leftarrow T_{0}}^{6,{\{ 6\}}}} \right\rbrack_{6,{\{{4,5}\}}} = {{\left\lbrack T_{2_{\leftarrow T_{0}}^{6,{\{ 6\}}}} \right\rbrack_{6,{\{{4,5}\}}} + \left\lbrack \Delta_{\underset{\leftarrow T_{0}}{{6{\{ 6\}}}\ }} \right\rbrack_{6,{\{{4,5}\}}}} = {{\left( {- 1} \right)^{\sigma_{T_{2}}{(6)}}w_{6,{\{{4,5,6}\}}}^{\langle 2\rangle}} + {0.}}}}$

So, it suffice to find w_(6,{4,5,6}) ^(<2>), which can be obtained from the parity equation

w_(6, {3, 4, 6})^(⟨2⟩) = −w_(3, {3, 4, 6})^(⟨2⟩) + w_(4, {3, 4, 6})^(⟨2⟩) = −(−1)^(σ_(T₂)(3))[T₂]_(3, {4, 6}) + (−1)^(σ_(T₂)(4))[T₂]_(4, {3, 6}).

Note that the latter symbols are located in columns {5,6} and {4,6}, which are already decoded. After decoding [T₂]_(6,{4,5}), the entire column {4,5} can be recovered.

Then the techniques described herein proceed with the recovery of not-yet-decoded columns. A similar procedure may be applied to column {3,5}. However, the decoding of column {3,4} is more challenging, since the techniques described herein have two uncoded symbols, namely, [T ₂]_(5,{3,4}) =w _(5,{3,4,5}) ^(<2>) +v _(6,{3,4,5,6}) ^(<0>),  (58) [T ₂]_(6,{3,4}) =w _(6,{3,4,6}) ^(<2>).  (59)

First note that w_(6,{3,4,6}) ^(<2>) can be found from the parity equation

${\overset{< 2 >}{w_{6,{\{{3,4,6}\}}}} = {{\overset{< 2 >}{- w_{3,{\{{3,4,6}\}}}} + \overset{< 2 >}{w_{4,{\{{3,4,6}\}}}}} = {{{- \left( {- 1} \right)^{\sigma_{T_{2}}}}{\,^{(3)}\left\lbrack T_{2} \right\rbrack_{3,{\{{4,6}\}}}}} + {\left( {- 1} \right)^{\sigma_{T_{2}}}{\,^{(4)}\left\lbrack T_{2} \right\rbrack_{4,{\{{3,6}\}}}}}}}},$

since columns {4,6} and {3,6} are already decoded. The first term in (58) can be also found in a similar manner.

$\begin{matrix} {{w_{5,{\{{3,4,5}\}}}^{< 2 >} = {{{- w_{3,{\{{3,4,5}\}}}^{< 2 >}} + w_{4,{\{{3,4,5}\}}}^{< 2 >}} = {{- {\left( {- 1} \right)^{\sigma_{T_{2}}(3)}\left\lbrack T_{2} \right\rbrack}_{3,{\{{4,5}\}}}} + {\left( {- 1} \right)^{\sigma_{T_{2}(4)}}\left\lbrack T_{2} \right\rbrack}_{4,{\{{3,5}\}}}}}},} & (60) \end{matrix}$

where the latter symbols are located in columns {4,5} and {3,5}, and hence already decoded.

In order to find the second term in (58), one may note that the injection of v_(6,{3,4,5,6}) ^(<0>) is secondary, and the same symbol is also primarily injected into position (4, {3}) of code segment T₅ (see (52)), i.e., [T ₅]_(4,{3}) =w _(4,{3,4}) ^(<5>) −v _(6,{3,4,5,6}) ^(<0>).  (61)

Recall that mode(T₅)=1<2=mode(T₂), and hence T₅ is already decoded. Hence,

$\begin{matrix} {w_{4,{\{{3,4}\}}}^{< 5 >} = {w_{3,{\{{3,4}\}}}^{< 5 >} = {{\left( {- 1} \right)^{\sigma_{T_{5}(3)}}\left\lbrack T_{5} \right\rbrack}_{3,{\{ 4\}}}.}}} & (62) \end{matrix}$

Therefore, the techniques described herein can retrieve w_(4,{3,4}) ^(<5>) from (62), and plug it into (61) to obtain v_(6,{3,4,5,6}) ^(<0>). Combining this with (60), the techniques described herein can decode both [T₂]_(5,{3,4}) and [T₂]_(6,{3,4}). Upon decoding the bottom part of column {3,4}, its top part can be recovered as before. Repeating a similar procedure the techniques described herein can decode all the columns of T₂. Once all three code segments of mode 1, i.e., T₁, T₂, and T₃ are decoded, the techniques described herein can proceed to the recovery of the root code segment T₀.

Assume a node f fails, and its codeword needs to be repaired using the repair data received from a set of helper nodes, say

with |

|=d. The repair data sent by each helper node is simply the collection of the repair data sent for each code segment. Here each helper node h∈

sends ∪_(i=0) ¹⁴{Ψ_(h)·T_(i)·Ξ^(f,(m) ^(i) ⁾} to node f, where m_(i) is the mode of code T_(i), e.g., m₀=4.

The content of node f may be reconstructed segment by segment. In contrast to the data recovery, the repair process is a top-to-bottom process. The process starts from the codeword segment (corresponding to the code segment with mode μ located at the root of the injection tree) of the failed node f. Note that no symbol is injected into T₀=T₀, and hence the repair of the first α⁽⁴⁾=15 symbols of node f is identical to that of a signed determinant code, as described in Proposition 2.

Once the segment corresponding to T₀ is repaired, the techniques described herein can proceed with the codeword segments corresponding to the child codes in the injection tree.

Let us focus on the repair of the symbol at position {2,3} of the codeword segment corresponding to T₂, i.e.,

$\begin{matrix} {\left\lbrack {\Psi_{f} \cdot T_{2}} \right\rbrack_{({2,3})} = {{\psi_{f,1}w_{1,{\{{1,2,3}\}}}^{{\langle 2\rangle}.}} + {\psi_{f,2}v_{2,{\{{2,3}\}}}^{{\langle 2\rangle}.}} + {\psi_{f,3}v_{3,{\{{2,3}\}}}^{{\langle 2\rangle}.}} + {\psi_{f,4}w_{4,{\{{2,3,4}\}}}^{{\langle 2\rangle}.}} + v_{3,{\{{2,3,4,6}\}}}^{{\langle 0\rangle}.} + {\psi_{f,5}\left( {w_{5,{\{{2,3,5}\}}}^{{\langle 2\rangle}.} + v_{6,{\{{2,3,5,6}\}}}^{{\langle 0\rangle}.}} \right)} + {\psi_{f,6}w_{6,{\{{2,3,6}\}}}^{{\langle 2\rangle}.}}}} & (63) \end{matrix}$

Upon receiving the repair symbols, node f recovers R^(f)(T₂)=T₂·Ξ^(f,(2)), where Ξ^(f,(2)) is defined in (9). Following (26) for

={2,3},

$\begin{matrix} {{\sum\limits_{x \in {\{{2,3}\}}}{\left( {- 1} \right)^{{\sigma_{T_{2}}{(x)}} + {in{d_{\{{2,3}\}}{(x)}}}}\left\lbrack {R^{f}\left( T_{2} \right)} \right\rbrack}_{x,{{\{{2,3}\}} \smallsetminus {\{ x\}}}}} = {{{- \left\lbrack {R^{f}\left( T_{2} \right)} \right\rbrack_{2,{\{ 3\}}}} + \left\lbrack {R^{f}\left( T_{2} \right)} \right\rbrack_{3,{\{ 2\}}}} = {{{- \ {\sum\limits_{\underset{{\mathcal{L}} = 2}{\mathcal{L} \subseteq {\lbrack 6\rbrack}}}\ {\left\lbrack T_{2} \right\rbrack_{2,\mathcal{L}}\Xi_{\mathcal{L},{\{ 3\}}}^{f,{(2)}}}}} + {\sum\limits_{\underset{{\mathcal{L}} = 2}{\mathcal{L} \subseteq {\lbrack 6\rbrack}}}\ {\left\lbrack T_{2} \right\rbrack_{3,\mathcal{L}}\Xi_{\mathcal{L},{\{ 2\}}}^{f,{(2)}}}}} = {{{- {\sum\limits_{y \in {\{{1,2,4,5,6}\}}}{\left\lbrack T_{2} \right\rbrack_{2,{\{{y,3}\}}}\Xi_{{\{{y,3}\}},{\{ 3\}}}^{f,{(2)}}}}} + {\sum\limits_{y \in {\{{1,3,4,5,6}\}}}{\left\lbrack T_{2} \right\rbrack_{3,{\{{y,2}\}}}\Xi_{{\{{y,2}\}},{\{ 2\}}}^{f,{(2)}}}}} = {{{- \left( {{{- \psi_{f,1}}w_{2,{\{{1,2,3}\}}}^{\langle 2\rangle}} - {\psi_{f,2}v_{2,{\{{2,3}\}}}^{\langle 2\rangle}} + {\psi_{f,4}w_{2,{\{{2,3,4}\}}}^{\langle 2\rangle}} + {\psi_{f,5}w_{2,{\{{2,3,5}\}}}^{\langle 2\rangle}} + {\psi_{f,6}w_{2,{\{{2,3,6}\}}}^{\langle 2\rangle}}} \right)} + \left( {{- {\psi_{f,1}\left( {w_{3,{\{{1,2,3}\}}}^{\langle 2\rangle} + v_{6,{\{{1,2,3,6}\}}}^{\langle 0\rangle}} \right)}} + {\psi_{f,3}v_{3,{\{{2,3}\}}}^{\langle 2\rangle}} + {\psi_{f,4}w_{3,{\{{2,3,4}\}}}^{\langle 2\rangle}} + {\psi_{f,5}w_{3,{\{{2,3,5}\}}}^{\langle 2\rangle}} + {\psi_{f,6}w_{3,{\{{2,3,6}\}}}^{\langle 2\rangle}}} \right)} = {{\psi_{f,1}w_{1,{\{{1,2,3}\}}}^{\langle 2\rangle}} + {\psi_{f,2}v_{2,{\{{2,3}\}}}^{\langle 2\rangle}} + {\psi_{f,3}v_{3,{\{{2,3}\}}}^{\langle 2\rangle}} + {\psi_{f,4}w_{4,{\{{2,3,4}\}}}^{\langle 2\rangle}} + {\psi_{f,5}w_{5,{\{{2,3,4}\}}}^{\langle 2\rangle}} + {\psi_{f,6}w_{6,{\{{2,3,4}\}}}^{\langle 2\rangle}} - {\psi_{f,1}v_{6,{\{{1,2,3,6}\}}}^{\langle 0\rangle}}}}}}}} & (64) \end{matrix}$

Comparing (63) and (64),

$\begin{matrix} {{\left\lbrack {\Psi_{f}\ .\ T_{2}} \right\rbrack_{\{{2,3}\}} - {\sum\limits_{x \in {\{{2,3}\}}}{\left( {- 1} \right)^{{+ {\sigma_{T_{2}}{(x)}}} + {in{d_{\{{2,3}\}}{(x)}}}}\left\lbrack {R^{f}\left( T_{2} \right)} \right\rbrack}_{x,{{\{{2,3}\}} \smallsetminus {\{ x\}}}}}} = {{\psi_{f,1}v_{6,{\{{1,2,3,6}\}}}^{\langle 0\rangle}} + {\psi_{f,4}v_{6,{\{{2,3,4,6}\}}}^{\langle 0\rangle}} + {\psi_{f,5}{v_{6,{\{{2,3,5,6}\}}}^{\langle 0\rangle}.}}}} & (65) \end{matrix}$

That means, the code segment T₂ cannot be individually repaired. However, all the three terms in the difference above are symbols of the code segment T₀. Interestingly, the repair space of the parent code T₀ at position (b,

∪

)=(6, {2,3,6}) includes

$\begin{matrix} {{- \left\lbrack {R^{f}\left( T_{0} \right)} \right\rbrack_{6,{\{{2,3,6}\}}}}\  = {{- \left\lbrack {R^{f}\left( T_{0} \right)} \right\rbrack_{6,{{\{{2,3}\}}\bigcup{\{ 6\}}}}} = {{- \ {\sum\limits_{\underset{{\mathcal{L}} = 4}{\mathcal{L} \subseteq {\lbrack 6\rbrack}}}\ {\left\lbrack T_{0} \right\rbrack_{6,\mathcal{L}}\Xi_{\mathcal{L},{\{{2,3,6}\}}}^{f,{(4)}}}}} = {{- {\sum\limits_{y \in {\{{1,4,5}\}}}{\left\lbrack T_{0} \right\rbrack_{6,{\{{y,2,3,6}\}}}\Xi_{{\{{y,2,3,6}\}},{\{{2,3,6}\}}}^{f,{(4)}}}}} = {{\psi_{f,1}v_{6,{\{{1,2,3,6}\}}}^{\langle 4\rangle}} + {\psi_{f,4}v_{6,{\{{2,3,4,6}\}}}^{\langle 4\rangle}} + {\psi_{f,5}{v_{6,{\{{2,3,5,6}\}}}^{\langle 4\rangle}.}}}}}}} & (66) \end{matrix}$

Therefore, summing up (64) and (66), the techniques described herein can exactly recover the missing symbol in (63). A similar procedure can be used to repair all the other symbols and codeword segments of the failed node f.

Consider an arbitrary subset of nodes

⊆[n] with |

|=k. Let Ψ[

, :] denote the k×d sub-matrix formed by collecting corresponding k rows of Ψ. The collection of coded symbols stored in these k nodes can be written as Ψ[

, :]·M. The goal is to recover the original message super-matrix M from the observed data Ψ[

, :]·M.

The message super-matrix M consists of several code segments such as T, each operating at a mode m=mode(T). The message matrix T of a code segment operating at mode m is a d×α_(m) matrix and can be partitioned into T and T, corresponding to the top k and bottom (d−k) rows of T, respectively. The data recovery is a bottom-to-top process. More precisely, the techniques described herein start by recovering the data symbols in the code segments at the lowest level of the injection tree (with the smallest mode) and proceed to the parent code segments, until the techniques described herein reach to the code segment at the root of the injection tree.

The message matrix T is a combination of an original signed determinant code T and the symbols injected from the parent code of T, namely P. More precisely,

$T_{{\overset{b,\mathcal{B}}{\leftarrow}}_{P}} = {T_{{\overset{b,\mathcal{B}}{\leftarrow}}_{P}} + {\Delta_{{\overset{b,\mathcal{B}}{\leftarrow}}_{P}}.}}$ Decoding this segment means decoding the entries of T, i.e., the combination of the original symbols and the injected symbols. The following lemma indicates the injected symbols can be easily separated from the original symbols.

Lemma 3 If a code segment

$T = {T_{{\overset{b,\mathcal{B}}{\leftarrow}}_{P}} = {T_{{\overset{b,\mathcal{B}}{\leftarrow}}_{P}} + \Delta_{{\overset{b,\mathcal{B}}{\leftarrow}}_{P}}}}$ is decoded (all entries of T are retrieved), then the symbols of the original signed determinant code

$T_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}$ and the injected symbols

$\Delta_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}$ can be uniquely extracted.

Proof of Lemma˜\reflm:decode:separate: Recall that there is redundancy among the entries of T. The claim on this lemma follows from the fact that there is (at most) one injection into each parity group. To see that, recall (19), which implies an injection into position (x,

) of T takes place only if x>max

. That means

may be last w-symbol in the parity group {

: y∈

∪{x}}. More precisely, for a position (x,

), with x≤max

,

${\left\lbrack \Delta_{\underset{\leftarrow P}{b,\mathcal{B}}} \right\rbrack_{x,X} = 0},{\left\lbrack T_{\underset{\leftarrow P}{b,\mathcal{B}}} \right\rbrack_{x,X} = {\left\lbrack T_{\underset{\leftarrow P}{b,\mathcal{B}}} \right\rbrack_{x,X}.}}$

Otherwise, if x>max

,

$\left\lbrack T_{\underset{\;{\overset{\mspace{31mu}}{\leftarrow}P}}{{b,\mathcal{B}}\;}} \right\rbrack_{x,\chi} = {{\left( {- 1} \right)^{\sigma_{T}{(x)}}w_{x,{\chi\bigcup{\{ x\}}}}} = {{\left( {- 1} \right)^{{\sigma_{T}{(x)}} + {\chi }}{\sum\limits_{y \in \chi}{\left( {- 1} \right)^{{ind}_{\chi}{(y)}}w_{y,{\chi\bigcup{\{ x\}}}}}}} = {\left( {- 1} \right)^{{\sigma_{T}{(x)}} + {\chi }}{\sum\limits_{y \in \chi}{{\left( {- 1} \right)^{{\sigma_{T}{(y)}} + {{ind}_{\chi}{(y)}}}\left\lbrack T_{\underset{\;{\overset{\mspace{31mu}}{\leftarrow}P}}{{b,\mathcal{B}}\;}} \right\rbrack}_{y,{{({\chi\bigcup{\{ x\}}})}\backslash{\{ y\}}}}.}}}}}$

Finally, once

$\left\lbrack T_{\underset{\;{\overset{\mspace{31mu}}{\leftarrow}P}}{{b,\mathcal{B}}\;}} \right\rbrack_{x,\chi}$ is recovered, the techniques described herein can find the injected symbol from

$\left\lbrack \Delta_{\underset{\;{\overset{\mspace{31mu}}{\leftarrow}P}}{{b,\mathcal{B}}\;}} \right\rbrack_{x,\chi} = {\left\lbrack T_{\underset{\;{\overset{\mspace{31mu}}{\leftarrow}P}}{{b,\mathcal{B}}\;}} \right\rbrack_{x,\chi} - {\left\lbrack T_{\underset{\;{\overset{\mspace{31mu}}{\leftarrow}P}}{{b,\mathcal{B}}\;}} \right\rbrack_{x,\chi}.}}$

Now consider an arbitrary code segment T. Note that the coded symbols in the codeword segment corresponding to T can be represented as

$\begin{matrix} {{{{\Psi\left\lbrack {,:} \right\rbrack} \cdot T} = {\left\lbrack {{\Gamma\left\lbrack {,:} \right\rbrack}❘{\Upsilon\left\lbrack {,:} \right\rbrack}} \right\rbrack\begin{bmatrix} \overset{\_}{T} \\ \underset{\_}{T} \end{bmatrix}}},} & (67) \end{matrix}$

where Γ[

, :] is an invertible matrix. Multiplying both sides of (67) by Γ[

, :]⁻¹,

$\begin{matrix} {{{\Gamma\left\lbrack {,:} \right\rbrack}^{- 1} \cdot {\Psi\left\lbrack {,:} \right\rbrack} \cdot T} = {{\left\lbrack {I❘{{\Gamma\left\lbrack {,:} \right\rbrack}^{- 1} \cdot {\Upsilon\left\lbrack {,:} \right\rbrack}}} \right\rbrack\begin{bmatrix} \overset{\_}{T} \\ \underset{\_}{T} \end{bmatrix}} = {\overset{\_}{T} + {{\Gamma\left\lbrack {,:} \right\rbrack}^{- 1} \cdot {\Upsilon\left\lbrack {,:} \right\rbrack} \cdot {\underset{\_}{T}.}}}}} & (68) \end{matrix}$

Note that (68) holds for every column of T. More precisely, for a column of T labeled by

, the data collector observes

+Γ[

,:]⁻¹·Υ[

,:]·

,  (69)

where

is the k×1 column and

is a (d−k)×1 column. Therefore, for each column

upon decoding

, the techniques described herein can compute the term Γ[

, :]⁻¹·Υ[

, :]·

, and cancel it from (69) to obtain

, and fully decode

.

Algorithm 1: Construction of Cascade Codes Super-Message Matrix Input: Parameters k, d and μ Output: Super-Message Matrix (M) of a cascade code operating at mode μ 1:

← SGNDETCODEMSGMAT (d, μ, o_(1xd)); add

to UnivistedNodeCollection; 2: $\left. \Delta_{0}\leftarrow O_{{dx}{(\begin{matrix} d \\ \mu \end{matrix})}} \right.;\left. T_{0}\leftarrow{{\mathbb{T}}_{0} + \Delta_{0}} \right.;\left. M\leftarrow T_{0} \right.;$ 3: while there exists a node

in UnvisitedNodeCollection do 4:  | for each

⊆ |k + 1: d| with |

| < mode (

) do 5:  | | m ← mode (

) − |

| − 1; 6:  | | for each x ∈ |k + 1 : d| with x ≤ max

do 7:  | | | for i ← 1 to d do

(i) ← 1 +

(i) +

(i); 8:  | | | 

← SGNDETCODEMSGMAT(k, d, m,

); 9:  | | | 

← INJECTIONMAT( d, m, x,

,

); 10:  | | | 

←

+

; 11:  | | | M ← [M|

]; add

to UnvisitedNodeCollection; 12:  | | end 13  | end 14  | remove

from UnvisitedNodeCollection; 15: end 16: return M; 17: Procedure SGNDETCODEMSGMAT ( k, d, m, σ_(D)): 18:  | for x ← 1 to d do 19:  | | for each I ⊆ [d] with [I] = m do 20:  | | if x ∈ [k + 1 : d] and I ∩ [k] = ϕ then

← 0; 21:  | | else If x ∈ I then

← (−1)

22:  | | else

← (−1)

23:  | | end 24:  | end 25: return

26: Procedure INJECTIONMAT (d, m, x,

): 27:  | for x ← 1 to d do 28:  | | for each I ⊆ [d] with |I| = m do 29:  | | | if i > maxI, i ∉

, I ∩ B = ϕ thenΔ_(t,l) ← (−1)

30:  | | else Δ_(t,J) ← 0; 31:   end 32:  end 33: return Δ;

The general decoding procedure includes the following stages:

1. Recursive decoding across code segments, from segments with mode 0 to those with higher modes, until the techniques described herein reach the root of the tree;

2. Within each code segment, the techniques described herein decode the columns recursively, according to the reverse lexicographical order; For each column labeled by

:

(a) The techniques described herein first decode the entries at the bottom part of column

belonging to

(

) to zero.

(b) The entries of the bottom part of column

that belong to either

(

) or

(

) may be decoded using the child codes (who have a lower mode, and hence already decoded).

(c) Then the techniques described herein decode the entries of the bottom part of column

belonging to group

(

), using the child codes and the parity equation. To this end, the techniques described herein need to use the symbols in columns

where

.

(d) Once the lower part of column

is decoded, the techniques described herein can recover its upper by canceling

from the collected data in (69).

The techniques described herein start with the following lemma, which guarantees that the decoding procedure explained above can start.

Lemma 4: There is no injection to the bottom part of any code segment of mode 0.

Proof of Lemma˜\reflm:bottom-mode0: Consider a code with message matrix T with mode(T)=0, which is introduced by its parent P via injection pair (b,

). Note that the only column of T is indexed by ø. According to (19), a possible injection to position (x, ø) of T may be

P_(b, ⌀⋃{x}⋃ℬ) = P_(b, {x}⋃ℬ) (up to a sign). For a position in the lower part of T, the techniques described herein have x∈[k+1: d]. This together with

⊆[k+1: d] implies that

P_(b, {x}⋃ℬ) ∈

(P) (see Definition 3), and hence, this symbol is set to zero, and not injected.

Based on this lemma, the stage (i) of decoding can be started, the techniques described herein recover symbols in the message matrices of codes with mode 0. Next, consider decoding a code segment T with mode(T)=m. Assume that all the message matrices with mode less than m, including all the child codes of T are already decoded. Stage (ii) of the decoding procedure can be performed as follows.

∈

(T): Recall that symbols in the first group are set to zero. Hence, no recovery is needed.

∈

(T)Å

(T): For a symbol

in groups

or

the techniques described herein have

1. no injection is performed to position (x,

) of T.

2.

is injected into a chide code Q of T, and hence, it can be recovered from the decoded child code.

To see (1), recall the injection equation (19), which implies a host position (x,

) may satisfy x>max

, which is in contradiction with x∈

for

and with x<max

for

. Moreover, (2) is followed from Lemma 3.

The last column of the code segment message matrix T of mode m is labeled by

𝒳 = [d − m + 1:d]. If a symbol

in the lower (d−k) rows of this column belongs to group

(T), then it may satisfy x>max

=d, which is not possible. This argument shows that the last column has no element from

, and hence is fully decoded as the only possible entries are from

,

or

.

Consider an arbitrary column

⊆[d] with |

|=m, and an element

∈

₂, i.e., x∈[k+1: d] and x>max

. The goal is to decode

. First, note that position (x,

) may be hosting a (secondary) injection from the parent code P. According to (19)

$\begin{matrix} {{T_{x,\chi} = {\left\lbrack T_{\underset{\;{\overset{\mspace{31mu}}{\leftarrow}P}}{{b,\mathcal{B}}\;}} \right\rbrack_{x,\chi} = {{\left\lbrack T_{\underset{\;{\overset{\mspace{31mu}}{\leftarrow}P}}{{b,\mathcal{B}}\;}} \right\rbrack_{x,\chi} + \Delta_{\underset{\;{\overset{\mspace{31mu}}{\leftarrow}P}}{{b,\mathcal{B}}\;}}} = {{{\left( {- 1} \right)^{\sigma_{T}{(x)}}w_{x,{\chi\bigcup{\{ x\}}}}} + {\left( {- 1} \right)^{1 + {\sigma_{P}{(x)}} + {ind}_{\chi\bigcup{\{ x\}}\bigcup{\mathcal{B}{(x)}}}}P_{b,{\chi\bigcup{\{ x\}}\bigcup\mathcal{B}}}x}} \notin \mathcal{B}}}}},{{\chi\bigcap\mathcal{B}} = \varnothing}} & (70) \end{matrix}$

So, in order to decode

the techniques described herein need to find both

and the injected symbol

. However, note that this injection is a secondary one for

, since the injection position is in the lower part of the child code. This symbol is also primarily injected into another child code Q with mode satisfying

$\begin{matrix} {{{mode}(Q)} = {{\overset{\_}{\chi\bigcup\left\{ x \right\}\bigcup\mathcal{B}}} - 1}} & (71) \\ {= {{{\overset{\_}{\chi}} + {\overset{\_}{\left\{ x \right\}}} + {\overset{\_}{\mathcal{B}}} - 1} = {{\overset{\_}{\chi}} - 1}}} & (72) \\ {{< {\overset{\_}{\chi}} < {\chi }} = {{mode}(T)}} & (73) \end{matrix}$

where (71) follows the primary injections in (20) and (22), (72) follows the facts that x∈[k+1: d] and

⊆[k+1: d], and (73) holds since columns of T are indexed by subsets of size |

|. Therefore, (73) immediately implies the child code hosting the primary injection of

has a lower mode, and hence is already decoded before the techniques described herein decode T. Therefore, the injected symbol

is known.

The second term in (70) can be decoded using the parity equation (7). Note that,

satisfies a parity equation along with

. Each w-symbol

is located in column

=(

∪{x})\{y}, i.e., y in

is replaced by x in

. Since x>y, the lexicographical order between

and

satisfies

. Therefore, due to the recursive procedure, every symbol in column

including

is already decoded. This allows us to retrieve

from

$T_{x,\chi} = {\left( {- 1} \right)^{{\sigma_{T}{(x)}} + {\chi } + 1}{\sum\limits_{y \in \chi}{\left( {- 1} \right)^{{\sigma_{T}{(y)}} + {{ind}_{\chi\bigcup{\{ x\}}}{(y)}}}{T_{x,{{({\chi\bigcup{\{ x\}}})}\backslash{\{ y\}}}}.}}}}$

Once both terms in (70) are found, the techniques described herein can decode

. A similar decoding rule can be applied to each symbol in the lower part of column

that belongs to

(T). Once all symbols in

are decoded, the techniques described herein can use (69) to obtain

. This may complete the recovery of column

. Then the techniques described herein can proceed with the next column of T until the message matrix T is fully decoded.

Algorithm 2: Data Recovery algorithm Input: Stacked contents of

nodes

⊆ [n] in the form of Ψ [

,:], M. Output : Recovered data file (entries of the super message matrix M). 1: M← [ ]; 2: for m ← 0 to μ do 3:  | for each Ψ [

:].

in Ψ[

:] · M with mode (

) = m do

Loop 1 4:  | | 

← DECODESEGMENT(Ψ[

:] ·

):

Loop 2 5:  | | M ← [

|M]; 6:  | | 

,

← GETDELTAS(

);

Globally store

and

7:  | end 8: end 9: return M ; 10: Procedure DECODESEGMENT(Ψ [

:] ·

): 11:  | for each I ⊆ [d] with [I] = m in the reverse lexicographical order do 12:  | | [S]_(:,I) ← DECODECOLUMNBOTTOM (Ψ[

:] ·

,I); 13:  | |  S _(:,I) ← r[

:]⁻¹ · [Ψ [

:] · S]_(:,I)...

Decode upper part using (73)  | | ...−r[

:]⁻¹ · Ψ [

:] · [S]_(:,I); 14:  | end 15:  |  $\left. s_{{(\underset{\leftarrow}{y,{\mathcal{y}}})}_{\mathbb{P}}}\leftarrow\begin{bmatrix} \overset{\_}{s} \\ \underset{\_}{s} \end{bmatrix} \right.$ 16: return

17: Procedure DECODECOLUMNBOTTOM (Ψ [

:] ·

,I): 18:  | 

← I ∩ [k];

← I ∩ [k + 1 : d]; 19:  | for x ← k + 1 to d do 20:  | | if x ≤ max

and

≠ ϕ then   

Symbol belonging to

21:  | | | [s]_(x,I) ← (−1)

. . .

Get  | | | injected symbol using (17) 22:  | | else if x ≤ max

and

= ϕ then   

Symbol belonging to

23:  | | | [s]_(x,I) ← 0 24:  | | else if x ≤ max

then   

Symbol belonging to

25:  | | | [s]_(x,I) ← (−1)

26:  | | | if x ∉

and I ∩

= ϕ and m > 0 then

A symbol is injected into [s]_(x,I) 27:  | | | |  B = B ∪ {x} ∪

← . . .

Get injected symbol  | | | | . . .

28:  | | | | 

 | | | | . . .+

; 29:  | | | end 30:  | | end 31:  | end 32: return [S]_(;,I) 36: Procedure GETDELTAS

: 37:  | m ← mode (

); 38:  | for i ← 1 to d do 39:  | | for I ⊆ [d + 1] with |I| = m do 40:  | | | if i > max X and i ∈

and I ∩ Y = ϕ then 41:  | | | | 

42:  | | | else 43:  | | | | 

44:  | | | end 45:  | | | 

; 46:  | | end 47:  | end 48: return

where R^(f)(Q) is the repair space of the code segment Q, and R^(f)(P) is the repair space of its parent code segment.

Note that for positions

that have an overlap with

(the second injection parameter), the repair identity above reduces to (11), and the repair may be performed as in an ordinary signed determinant code. For positions

which are disjoint from

, the original repair equation has an interference caused by the injected symbols. However, this interference can be canceled using the repair space of the parent code.

In this section, the techniques described herein may show that upon failure of any node, its content can be exactly reconstructed by accessing d helper nodes and downloading β(d, k; μ) symbols from each. More formally, the techniques described herein prove that for any failed node f∈[n], any symbol at position

of any code segment

$Q_{\underset{\;{\overset{\mspace{31mu}}{\leftarrow}P}}{{b,\mathcal{B}}\;}}^{(m)}$ of node f can be repaired using identity (26)

$\begin{matrix} {\left\lbrack {\Psi_{f} \cdot Q_{{\underset{\leftarrow}{b,\mathcal{B}}}_{P}}} \right\rbrack_{\mathcal{J}} = {{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{Q}(x)} + {{ind}_{\mathcal{J}}(x)}}\left\lbrack {R^{f}(Q)} \right\rbrack}_{x{\mathcal{J}\backslash{\{ x\}}}}} - \left( \begin{matrix} \left\lbrack {R^{f}(P)} \right\rbrack_{b,{\mathcal{J}\bigcup\mathcal{B}}} & {{{{{if}\mathcal{J}}\bigcup\mathcal{B}} = \varnothing},} \\ 0 & {{otherwise},} \end{matrix} \right.}} &  \end{matrix}$

The formal proof of identity (26) is given in the following.

Proof of Proposition˜\refprop:nkd:repair. Let node f fails, and its content needs to be repaired using the repair data received from the helper nodes in

with |

|=d. The content of node f may be reconstructed segment by segment.

Consider a code segment

${Q = Q_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}},$ that is a determinant code with mode m and injection pair (b,

), into which symbols from its parent code P with mode(P)=j are injected. Recall that the corresponding code segment matrix can be written as

${Q_{\underset{\leftarrow}{b,\mathcal{B}}}}_{P} = {{Q_{\underset{\leftarrow}{b,\mathcal{B}}}}_{P} + {\Delta_{\underset{\leftarrow}{b,\mathcal{B}}}}_{P^{\prime}}}$

where the first term is a signed determinant code and the second term indicates the contribution of injection. For a given position

within this codeword segment, with

⊆[d] with |

|=m, the corresponding symbol of the failed node is given by

$\left\lbrack {\Psi_{f} \cdot Q_{{\underset{\leftarrow}{b,\mathcal{B}}}_{P}}} \right\rbrack_{\mathcal{J}} = {\left\lbrack {\Psi_{f} \cdot Q_{{\underset{\leftarrow}{b,\mathcal{B}}}_{P}}} \right\rbrack_{\mathcal{J}} + {\left\lbrack {{\Psi_{f} \cdot \Delta_{{\underset{\leftarrow}{b,\mathcal{B}}}_{P}}},} \right\rbrack_{\mathcal{J}}.}}$

As it is clear from (26), the repair of segment Q of the codeword of f may be performed similar to that of the determinant codes using the repair space R^(f)(Q)=Q·Ξ^(f,(m)), together with a correction using the repair space of the repair of the parent code, that is R^(f)(P)=P·Ξ^(f,(j)). Note that the latter correction may take care of the deviation of the code segment from the standard determinant code which is caused by injection of the symbols from the parent code P.

The techniques described herein start with the first term in the right-hand-side of (26), which is

$\begin{matrix} \begin{matrix} {{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{Q}(x)} + {in{d_{\mathcal{J}}(x)}}}\left\lbrack {R^{f}(Q)} \right\rbrack}_{x{\mathcal{J} \smallsetminus {\{ x\}}}}} = {\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{Q}(x)} + {{ind}_{\mathcal{J}}(x)}}\left\lbrack {Q_{{\underset{\leftarrow}{b,\mathcal{B}}}_{P}}\Xi^{f,{(m)}}} \right\rbrack}_{x,{\mathcal{J}\backslash{\{ x\}}}}}} \\ {= {{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{Q}(x)} + {{ind}_{\mathcal{J}}(x)}}\left\lbrack {Q_{{\underset{\leftarrow}{b,\mathcal{B}}}_{P}}\Xi^{f,{(m)}}} \right\rbrack}_{x,{\mathcal{J}\backslash{\{ x\}}}}} +}} \\ {\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{Q}(x)} + {{ind}_{\mathcal{J}}(x)}}\left\lbrack {\Delta_{{\underset{\leftarrow}{b,\mathcal{B}}}_{P}}\Xi^{f,{(m)}}} \right\rbrack}_{x,{\mathcal{J}\backslash{\{ x\}}}}} \end{matrix} & (74) \end{matrix}$ $\begin{matrix} {= {\left\lbrack {\Psi_{f} \cdot Q_{{\underset{\leftarrow}{b,\mathcal{B}}}_{P}}} \right\rbrack_{\mathcal{J}} + {\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{Q}(x)} + {{ind}_{\mathcal{J}}(x)}}\left\lbrack {\Delta_{{\underset{\leftarrow}{b,\mathcal{B}}}_{P}}\Xi^{f \cdot {(m)}}} \right\rbrack}_{x,{\mathcal{J}\backslash{\{ x\}}}}}}} & (75) \end{matrix}$

where (74) holds due to the linearity of the operations, and (75) used Proposition 2 for the repair of

$Q_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}$ which is a (d; m) signed determinant code with signature vector σ_(Q). Therefore, proving the claimed identity reduces to show

$\begin{matrix} {{{{Term}_{1} - {Term}_{2}} = {Term}_{3}},} & (76) \end{matrix}$ $\begin{matrix} {{{{where}{Term}_{1}} = \left\lbrack {\Psi_{f}\Delta_{\underset{\leftarrow P}{b,\mathcal{B}}}} \right\rbrack_{\mathcal{J}}}{{Term}_{2} = {\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{Q}(x)} + {{ind}_{\mathcal{J}}(x)}}\left\lbrack {\Delta_{\underset{\leftarrow P}{b,\mathcal{B}}}\Xi^{f,{(m)}}} \right\rbrack}_{x,{\mathcal{J}\backslash{\{ x\}}}}}}{{Term}_{3} = {{- \left\lbrack {R^{f}(P)} \right\rbrack_{b,{\mathcal{J}\bigcup\mathcal{B}}}}1\left\{ {{\mathcal{J}\bigcap\mathcal{B}} = \varnothing} \right\}}}} & (77) \end{matrix}$

Note that all the data symbols appearing in (77) belong the parent code segment matrix P. The techniques described herein can distinguish the following two cases in order to prove (76).

Case I:

∩

=ø: Starting by Term₁

${Term}_{1} = {\left\lbrack {\Psi_{f}\Delta_{\underset{\leftarrow P}{b,\mathcal{B}}}} \right\rbrack_{\mathcal{J}} = {\sum\limits_{y \in {\lbrack d\rbrack}}{\psi_{f,y}\left\lbrack \Delta_{\underset{\leftarrow P}{b,\mathcal{B}}} \right\rbrack}_{y,\mathcal{J}}}}$ $\begin{matrix} {= {\sum\limits_{y \in {{\lbrack{{{\max\mathcal{J}} + 1}:d}\rbrack}\backslash\mathcal{B}}}{\psi_{f,y}\left\lbrack \Delta_{\underset{\leftarrow P}{b,\mathcal{B}}} \right\rbrack}_{y,\mathcal{J}}}} & (78) \end{matrix}$ $\begin{matrix} {= {\sum\limits_{y \in {{\lbrack{{{\max\mathcal{J}} + 1}:d}\rbrack}\backslash{\mathcal{B}({\mathcal{J}\bigcup\mathcal{B}})}}}{\psi_{f,y}\left\lbrack \Delta_{\underset{\leftarrow P}{b,\mathcal{B}}} \right\rbrack}_{y,\mathcal{J}}}} & (79) \end{matrix}$ $\begin{matrix} {{= {\sum\limits_{y \in {{\lbrack{{{\max\mathcal{J}} + 1}:d}\rbrack}{\text{\textbackslash(}{{\mathcal{J}\bigcup\mathcal{B}})}}}}{\left( {- 1} \right)^{1 + {\sigma_{P}{\{ y\}}} + {{ind}_{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}(y)}}\psi_{f,y}P_{b,{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}}}}},} & (80) \end{matrix}$

where (78) follows the definition of the injection symbols in (19) which implies a non-zero injection occurs at position (y,

) only if y>max

and y∉

; (79) holds since [max

+1: d]∩

=ø; and in (80) the techniques described herein plugged in the entries of

$\Delta_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}$ from (19).

Next, for Term₂

${Term}_{2} = {\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{Q}(x)} + {{ind}_{\mathcal{J}}(x)}}\left\lbrack {\Delta_{\underset{\leftarrow P}{b,\mathcal{B}}}\Xi^{f,{(m)}}} \right\rbrack}_{x,{\mathcal{J}\backslash{\{ x\}}}}}$ $= {\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{Q}(x)} + {{ind}_{\mathcal{J}}(x)}}{\sum\limits_{\substack{\mathcal{L} \subseteq {\lbrack d\rbrack} \\ {❘\mathcal{L}❘} = m}}{\left\lbrack \Delta_{\underset{\leftarrow P}{b,\mathcal{B}}} \right\rbrack_{x,\mathcal{L}}\left\lbrack \Xi^{f,{(m)}} \right\rbrack}_{\mathcal{L},{\mathcal{J}\backslash{\{ x\}}}}}}}$ $\begin{matrix} {= {\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{Q}(x)} + {{ind}_{\mathcal{J}}(x)}}{\sum\limits_{\substack{y \in {\lbrack d\rbrack} \\ y \notin {\mathcal{J}\backslash{\{ x\}}}}}{\left\lbrack \Delta_{\underset{\leftarrow P}{b,\mathcal{B}}} \right\rbrack_{x,{{({\mathcal{J}\backslash{\{ x\}}})}\bigcup{\{ y\}}}}\left\lbrack \Xi^{f,{(m)}} \right\rbrack}_{{{({\mathcal{J}\backslash{\{ x\}}})}\bigcup{\{ y\}}},{\mathcal{J}\backslash{\{ x\}}}}}}}} & (81) \end{matrix}$ $\begin{matrix} {= {\sum\limits_{x = {\max\mathcal{J}}}{\left( {- 1} \right)^{{\sigma_{Q}(x)} + {{ind}_{\mathcal{J}}(x)}}{\sum\limits_{\substack{y < x \\ y \notin {({\mathcal{J}\bigcup\mathcal{B}})}}}{\left\lbrack \Delta_{\underset{\leftarrow P}{b,\mathcal{B}}} \right\rbrack_{x,{{({\mathcal{J}\backslash{\{ x\}}})}\bigcup{\{ y\}}}}\left\lbrack \Xi^{f,{(m)}} \right\rbrack}_{{{({\mathcal{J}\backslash{\{ x\}}})}\bigcup{\{ y\}}},{\mathcal{J}\backslash{\{ x\}}}}}}}} & (82) \end{matrix}$ $\begin{matrix} {= {\left( {- 1} \right)^{{\sigma_{Q}({\max\mathcal{J}})} + {{ind}_{\mathcal{J}}({\max\mathcal{J}})}}{\sum\limits_{y \in {{\lbrack{\max\mathcal{J}}\rbrack}{\text{\textbackslash(}{{\mathcal{J}\bigcup\mathcal{B}})}}}}{\left\lbrack \Delta_{\underset{\leftarrow P}{b,\mathcal{B}}} \right\rbrack_{{\max\mathcal{J}},{\mathcal{J}\bigcup{{\{ y\}}{\text{\textbackslash(}{{\max\mathcal{J}})}}}}}\left\lbrack \Xi^{f,{(m)}} \right\rbrack}_{{\mathcal{J}\bigcup{{\{ y\}}\backslash{\{{\max\mathcal{J}}\}}}},{\mathcal{J}\backslash{\{{\max\mathcal{J}}\}}}}}}} & (83) \end{matrix}$ $\begin{matrix} {= {\left( {- 1} \right)^{{\sigma_{Q}({\max\mathcal{J}})} + {{ind}_{\mathcal{J}}({\max\mathcal{J}})}}{\sum\limits_{y \in {{\lbrack{\max\mathcal{J}}\rbrack}{\text{\textbackslash(}{{\mathcal{J}\bigcup\mathcal{B}})}}}}{\left\{ {\left\lbrack \text{⁠}{\left( {- 1} \right)^{1 + {\sigma_{P}({\max\mathcal{J}})} + {{ind}_{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}({\max\mathcal{J}})}}\text{⁠}P_{b,{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}}} \right\rbrack \cdot \text{ }\left\lbrack \text{⁠}{\left( {- 1} \right)^{{\sigma_{Q}(y)} + {{ind}_{{({\mathcal{J}\backslash{\{{\max\mathcal{J}}\}}})}\bigcup{\{ y\}}}(y)}}\psi_{f,y}} \right\rbrack} \right\}.}}}} & (84) \end{matrix}$

Note that in (81) the techniques described herein have used the definition of matrix Ξ^(f,(m)) in (9) that implies the entry in position (

,

\{x}) is non-zero only if

=(

\{x})∪{y} for some y∈

\{x}. Moreover, (82) follows from the definition of injected entries in (19), which implies the entry of

$\Delta_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}$ at position (x, (

\{x})∪{y}) is non-zero only if all the following conditions hold:

$\left\{ \begin{matrix} {x > {{\max\left( {\backslash\left\{ x \right\}} \right)}\bigcup\left\{ y \right\}}} & {\left. \Rightarrow{y < \ {xandx}\  > {\max\left( {\smallsetminus \left\{ x \right\}} \right)}} \right.\ ,} \\ {{\left( {\left( {\smallsetminus \left\{ x \right\}} \right)\bigcup\left\{ y \right\}} \right)\bigcap\mathcal{B}} = \varnothing} & {{\left. \Rightarrow y \right. \notin \mathcal{B}},} \end{matrix} \right.\quad$

which together imply x=max

and y∈[max

]\(

∪

). In (84) the matrix entries are replaced from their definitions in(9) and (19).

Next note that the overall sign in (84) can be simplified as follows. First,

$\begin{matrix} {{{\sigma_{Q}{()}} + {()} + {\sigma_{P}{()}} + {()}} = {\left\lbrack {1 + {\sigma_{P}{()}} + {()}} \right\rbrack + {()} + {\sigma_{P}{()}} + {()}}} & (85) \\ {{\equiv {1 + {()} + {()} + {()}}}{\left( {{mod}\; 2} \right) = {1 + {\left\{ {u \in {{\mathcal{B}\bigcup{{\{\}}\text{:}\mspace{14mu} u}} \leq}} \right\} } + {\left\{ {u \in {{\text{:}\mspace{14mu} u} \leq}} \right\} } + {\left\{ {u \in {{\bigcup\left\{ y \right\}\bigcup{\mathcal{B}\text{:}\mspace{14mu} u}} \leq}} \right\} }}}} & (86) \\ \left. {{{= {1 + \left\lbrack {{\left\{ {u \in {{\mathcal{B}\text{:}\mspace{14mu} u} \leq}} \right\} } + 1} \right\rbrack + {\left\{ {u \in {{\text{:}\mspace{14mu} u} \leq}} \right\} } + {\left\lbrack  \right.\left\{ {u \in {{\bigcup{\mathcal{B}\text{:}\mspace{20mu} u}} \leq}} \right\}}}}} + 1} \right\rbrack & (87) \\ {\mspace{79mu}{= {3 + {2{\left\{ {u \in {{\bigcup{\mathcal{B}\text{:}\mspace{14mu} u}} \leq}} \right\} }}}}} & (88) \\ {\mspace{79mu}{{\equiv {1\;\left( {{mod}\; 2} \right)}},}} & (89) \end{matrix}$

where (85) is due to the definition of the child code's signature in (17); (86) plugged in the definition of ind·(⋅) from (2); equality in (87) holds since y<max

=x; and (88) is due the fact that sets

and

are disjoint. Similarly,

$\begin{matrix} {{{\sigma_{Q}(y)} + {(y)}} = {\left\lbrack {1 + {\sigma_{P}(y)} + {{ind}_{\mathcal{B}\bigcup{\{ y\}}}(y)}} \right\rbrack + {(y)}}} & (90) \\ {= {1 + {\sigma_{P}(y)} + {\left\{ {{u \in {\mathcal{B}\bigcup\left\{ y \right\}}}:{u \leq y}} \right\} } + {\left\{ {u \in {{\left( {\backslash{\{\}}} \right)\bigcup{\left\{ y \right\}\text{:}\mspace{14mu} u}} \leq y}} \right\} }}} & (91) \\ {\mspace{79mu}{= {1 + {\sigma_{P}(y)} + {\left\{ {{u \in {\mathcal{B}\bigcup\left\{ y \right\}}}:{u \leq y}} \right\} } + {\left\{ {u \in {{\bigcup{\left\{ y \right\}\text{:}\mspace{14mu} u}} \leq y}} \right\} }}}} & (92) \\ {\mspace{79mu}{= {1 + {\sigma_{P}(y)} + {{\left\{ {u \in {{\bigcup\left\{ y \right\}\bigcup{\mathcal{B}\text{:}\mspace{14mu} u}} \leq y}} \right\} + 1}}}}} & (93) \\ {\mspace{79mu}{{\equiv {{\sigma_{P}(y)} + {(y)\;\left( {{mod}\; 2} \right)}}},}} & (94) \end{matrix}$

where (90) used the definition of the child code's signature in (17); (91) and (94) plugged in the definition of ind·(⋅) given in (2); equality in (92) follows the fact that y<max

; and (93) holds since

and

are disjoint sets.

Plugging (89) and (94) into (84)

$\begin{matrix} {{Term}_{2} = {- {\sum\limits_{y \in {{\lbrack{\max\mathcal{J}}\rbrack}{\text{\textbackslash(}{{\mathcal{J}\bigcup\mathcal{B}})}}}}{\left( {- 1} \right)^{1 + {\sigma_{P}(y)} + {{ind}_{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}(y)}}\psi_{f,y}{P_{b,{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}}.}}}}} & (95) \end{matrix}$ Lastly, $\begin{matrix} {{- {Term}_{3}} = {{- \left\lbrack {R^{f}(P)} \right\rbrack_{b,{\mathcal{J}\bigcup\mathcal{B}}}} = {- \left\lbrack {P \cdot {\Xi}^{f,{(j)}}} \right\rbrack_{b,{\mathcal{J}\bigcup\mathcal{B}}}}}} & (96) \end{matrix}$ $\begin{matrix} {= {- {\sum\limits_{\mathcal{L} \subseteq {\lbrack d\rbrack}}{P_{b,\mathcal{L}} \cdot \left\lbrack \Xi^{f,{(j)}} \right\rbrack_{\mathcal{L},{\mathcal{J}\bigcup\mathcal{B}}}}}}} & (97) \end{matrix}$ $\begin{matrix} {= {- {\sum\limits_{y \in {{\lbrack d\rbrack}{\text{\textbackslash(}{{\mathcal{J}\bigcup\mathcal{B}})}}}}{P_{b,{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}} \cdot \left\lbrack \Xi^{f,{(j)}} \right\rbrack_{{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}},{\mathcal{J}\bigcup\mathcal{B}}}}}}} & (98) \end{matrix}$ $\begin{matrix} {= {\sum\limits_{y \in {{\lbrack d\rbrack}{\text{\textbackslash(}{{\mathcal{J}\bigcup\mathcal{B}})}}}}{\left( {- 1} \right)^{1 + {\sigma_{P}(y)} + {{ind}_{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}(y)}}\psi_{f,y}P_{b,{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}}}}} & (99) \end{matrix}$ $\begin{matrix} {= {\sum\limits_{y \in {{\lbrack d\rbrack}{\text{\textbackslash(}{{\mathcal{J}\bigcup\mathcal{B}})}}}}{\left( {- 1} \right)^{1 + {\sigma_{P}(y)} + {{ind}_{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}(y)}}\psi_{f,y}P_{b,{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}}}}} & (100) \end{matrix}$

where (100) holds since an injection at position (b,

∪{y}∪

) of matrix P may be performed only if b>max{

∪{y}∪

} which is in contradiction with b≤max

, which is a required condition for the injection pair (b,

) as specified. Therefore, from (80) and (95)

${{{Term}_{1} - {Term}_{2}} = {{{\sum\limits_{y \in {{\lbrack{{{\max\mathcal{J}} + 1}:d}\rbrack}{\text{\textbackslash(}{{\mathcal{J}\bigcup\mathcal{B}})}}}}{\left( {- 1} \right)^{1 + {\sigma_{P}(y)} + {{ind}_{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}(y)}}\psi_{f,y}P_{b,{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}}}} + {\sum\limits_{y \in {{\lbrack{\max\mathcal{J}}\rbrack}{\text{\textbackslash(}{{\mathcal{J}\bigcup\mathcal{B}})}}}}{\left( {- 1} \right)^{1 + {\sigma_{P}(y)} + {{ind}_{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}(y)}}\psi_{f,y}P_{b,{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}}}}} = {{\sum\limits_{y \in {{\lbrack d\rbrack}{\text{\textbackslash(}{{\mathcal{J}\bigcup\mathcal{B}})}}}}{\left( {- 1} \right)^{1 + {\sigma_{P}(y)} + {{ind}_{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}(y)}}\psi_{f,y}P_{b,{\mathcal{J}\bigcup{\{ y\}}\bigcup\mathcal{B}}}}} = {Term}_{3}}}},$

which is the desired identity in (76).

Case II:

∩

≠ø: First note that each term in (78) consists of at entry from

$\Delta_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}$ a position (y,

), which is zero for

∩

≠ø. Therefore the techniques described herein have Term₁=0.

Similarly, the entry of

$\Delta_{\underset{\leftarrow_{P}}{b,\mathcal{B}}}$ at position (x, (

\{x})∪{y}) is non-zero only

     if  ((∖{x})⋃{y})⋂ℬ = 0  and  x ∉ ℬ.  This  implies 0 = ((∖{x})⋃{y})⋂ℬ ≥ (∖{x})⋂ℬ ≥ ⋂ℬ − {x}⋂ℬ = ⋂ℬ ≥ 1.

This contradiction implies that all the terms in (81) are zero, and hence Term₂=0. Finally, Term₃ is zero by its definition. Therefore, the identity (76) clearly holds. This completes the proof.

In this section, the techniques described herein compare the code construction proposed in this disclosure with the product-matrix (PM) code. Since both code constructions are linear, they both can be written as a product of encoder matrix and a message matrix, i.e.,

=Ψ·M. However, there are several important differences between the two constructions. Some of the main distinctions between the two code construction are highlighted in Table 2.

TABLE 2 A comparison between the product-matrix and cascade codes Product-Matrix Code The techniques described herein Only for extreme points For the entire storage - bandwidth MBR and MSR trade-off MSR code construction: MSR code construction: only for d ≥ 2k − 1 all parameter sets MSR point parameters: MSR point parameters: (α, β, F) = (d − k + 1, 1, (α, β, F) = ((d − k + 1)^(k), k(d − k + 1)) (d − k + 1)^(k−1), k(d − k + 1)^(k)) Different structure and 2*Universal code construction for requirement for the the entire trade-off encoder matrix of MBR and MSR codes Repair data encoders are A systematic repair encoder Ξ rows of the main code for each point on the trade-off encoder

The MSR point is fundamentally different. To show this, the techniques described herein can rely on the standard notion of similarity is a well-defined criterion to check if two codes are convertible to each other. Two linear codes

and

′ are equivalent if

′ can be represented in terms of

by

1. a change of basis of the vector space generated by the message symbols (i.e., a remapping of the message symbols), and

2. a change of basis of the column-spaces of the nodal generator matrices (i.e., a remapping of the symbols stored within a node).

3. scale parameters of (α, β, F) of codes by an integer factor so that both codes have the same parameters.

To show that the two codes are not similar, the techniques described herein focus on a special case, namely an MSR code with for an (n, k, d=2k−2) distributed storage system for k>2. For such a system, the parameters of the MSR cascade code are given from Corollary 1 as (α, β, F=((k−1)^(k), (k−1)^(k-1), k(k−1)^(k)). On the hand, the parameters of the PM code are given by (α, β, F)=(k−1,1, k(k−1)), and its message matrix can be written as

${M^{\prime} = \begin{bmatrix} S_{1} \\ S_{2} \end{bmatrix}},$

where S₁ and S₂ are α×α symmetric matrices. Hence, the number data symbols in M′ is

${2\begin{pmatrix} {\alpha + 1} \\ 2 \end{pmatrix}} = {{\left( {\alpha + 1} \right)\alpha} = {{k\left( {k - 1} \right)}.}}$ The encoder matrix is of the form Ψ′=[Φ|ΛΦ],  (101)

where Φ is an n×α matrix and Λ is an n×n diagonal matrix. The matrices Φ and Λ may be chosen that

-   -   any d rows of Ψ′ are linearly independent.     -   any α rows of Φ are linearly independent.     -   the diagonal entries of Λ are distinct.

Even though the requirements above are different for the proposed code construction, a Vandermonde matrix satisfies conditions both constructions. The MSR PM code is given by

′=Ψ′·M′. So, in order for a fair comparison, one needs to concatenate N=(k−1)^(k-1) copies of little PM codes with independent message matrices M′₁, M′₂, . . . , M′_(N) to obtain a code with the same parameters as the cascade code.

The techniques described herein denote by Rep_(h→f) and Rep′_(h→f) the vector space spanned by the repair symbols sent by a helper node h to repair of a failed node f for the cascade and PM codes, respectively. Then, the following proposition highlights at least one important difference in the structure of two codes, to show that they are not similar with respect to the above definition.

Proposition 6: For an MSR code for an (n, k, d=2k−2) distributed storage system with parameters (α, β, F)=((k−1)^(k), (k−1)^(k-1), k(k−1)^(k)), and three distinct nodes h, f, and g,

$\begin{matrix} {{\dim\left( {{Rep}_{h\rightarrow f}\bigcap{Rep}_{h\rightarrow g}} \right)} = {\sum\limits_{m = 0}^{\mu}{\left( {d - k} \right)^{\mu - m}\left\lbrack {{2\begin{pmatrix} {k - 1} \\ {m - 1} \end{pmatrix}} - \begin{pmatrix} k \\ m \end{pmatrix} - \begin{pmatrix} {k - 2} \\ m \end{pmatrix}} \right\rbrack}}} & (102) \\ {\mspace{79mu}{while}} & \; \\ {\mspace{79mu}{{\dim\left( {{Rep}_{h\rightarrow f}^{\prime}\bigcap{Rep}_{h\rightarrow g}^{\prime}} \right)} = 0.}} & (103) \end{matrix}$

Proof of Proposition˜\refprop:diff: Recall that the repair data Rep_(h→f) is simply the concatenation of repair data for each code segment, which is a (modified) signed determinant code. For evaluation for the overlap between two subspaces spanned by the repair symbols sent for two failed nodes for any code segment: for code segment with mode m, the dimension of the overlap between the subspaces spanned by the repair symbols sent from h to f and g is given by

${2\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}} - {\left\lbrack {\begin{pmatrix} d \\ m \end{pmatrix} + \begin{pmatrix} {d - 2} \\ m \end{pmatrix}} \right\rbrack.}$ Hence, summing up over all code segments,

$\begin{matrix} {{\dim\left( {{Rep}_{h\rightarrow f}\bigcap{Rep}_{h\rightarrow g}} \right)} = {{\sum\limits_{m = 0}^{\mu}{\ell_{m}\left\lbrack {{2\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}} - \begin{pmatrix} d \\ m \end{pmatrix} - \begin{pmatrix} {d - 2} \\ m \end{pmatrix}} \right\rbrack}} = {{\sum\limits_{m = 0}^{\mu}{\ell_{m}\left\lbrack {{2\;\beta_{m}} - \alpha_{m} + \begin{pmatrix} {d - 2} \\ m \end{pmatrix}} \right\rbrack}} = {{\sum\limits_{m = {- \infty}}^{\infty}{p_{\mu - m}\left\lbrack {{2\beta_{m}} - \alpha_{m} + \begin{pmatrix} {d - 2} \\ m \end{pmatrix}} \right\rbrack}} = {\sum\limits_{m = 0}^{\mu}{{\left( {d - k} \right)^{\mu - m}\left\lbrack {{2\begin{pmatrix} {k - 1} \\ {m - 1} \end{pmatrix}} - \begin{pmatrix} k \\ m \end{pmatrix} - \begin{pmatrix} {k - 2} \\ m \end{pmatrix}} \right\rbrack}.}}}}}} & (104) \end{matrix}$

where (104) used (37) and (41), for the first and second summands, respectively. Moreover, the third summand in the summation can be simplified using Lemma 2 for a=−2 and b=0.

Next, note that resulting PM code is obtained from concatenating independent little PM codes, each with β=1. Hence, for each little PM code, the overlap between the spaces spanned by repair symbols sent for two failed nodes may be of dimension either 0 or 1. Assume the latter holds. Then the repair symbol sent from h to f and g are identical (up to a multiplicative constant), i.e., Rep′_(h→f)=Rep′_(h→g). By symmetry, the same may hold for any other failed node. Now, consider a set of helper nodes

with |

|=d, and a set of failed nodes with

with |

|=k. The techniques described herein can repair the entire set

by sending downloading only β=1 symbol from each of the helper nodes in

, since Rep′_(h→f)=Rep′_(h→g) for any f, g∈

and any h∈

. On the other hand, the entire file of the little PM code may be recoverable for the content of nodes in

. This implies

${{k\left( {k - 1} \right)} = {{F \leq {\sum\limits_{h \in \mathcal{H}}{\dim\left( {Rep}_{h\rightarrow f}^{\prime} \right)}}} = {{d\;\beta} = {2\left( {k - 1} \right)}}}},$

which is in contradiction with k>2. Therefore, the techniques described herein have dim(Rep′_(h→f)∩Rep′_(h→g))=0 for any little PM code. Summing up over all copies of independent little PM codes the techniques described herein obtain the claim of the proposition.

An immediate consequence of this proposition is that cascade codes and PM codes are not similar, and cannot be converted to each other by any scaling and mapping of the raw or coded symbols.

The parity equation (7) and the redundant symbols in the message matrices play a critical role in the proposed code construction. Such symbols were initially introduced to facilitate node repair in the original determinant codes, without being important for data recovery. While having such redundancy could cause an inefficiency for the overall storage capacity of the code, the lower bounds show that determinant codes are optimum for d=k.

These redundant symbols play two roles in the cascade codes: (1) they help with the repair mechanism, similar to their role in determinant codes, and (2) they make the data recovery possible, in spite of the fact that the data collector only accesses k<d nodes. More intuitively, this redundancy is used to provide a backup copy of the symbols who could be missed in data recovery, due to the fact that a k×d sub-matrix of the encoder, i.e., Ψ[

, :], is not invertible for k<d.

Surprisingly, the number of such missing symbols (evaluated in (16)) is exactly the same as the number of redundant symbols in the entire code (given in (25)). This suggests the proposed code has no further room to be improved. On the other hand, the proposed construction universally achieves the optimum trade-off for MBR codes (see Corollary 1), MSR codes (see Corollary 1), an interior operating point on the cut-set bound (see Corollary 2), codes with k=d, and for an (n, k, d)=(5,3,4) system, for which a matching lower bound is provided. These facts altogether support the conjecture that the cascades codes are optimum exact regenerating codes for any set of parameters (n, k, d).

These evidences altogether support the injection that the cascades codes are optimum exact regenerating codes for any set of parameters (n, k, d). Of course, a matching lower bound for the trade-off is needed to prove the conjecture.

The main remaining problem to be addressed in this direction is to provide a lower bound for the trade-off between the storage and repair-bandwidth for exact-repair regenerating codes. As mentioned above, a tight lower bound may match with the trade-off achieved in this disclosure, indicating the optimality of the proposed construction.

There are some aspects of this work that can be improved. For instance, even though the sub-packetization of the codes provided in this disclosure is independent of the number of nodes n, it is exponential in parameter k. An interesting question is to develop construction that achieves the same trade-off with smaller sub-packetization and independent of n. Multiple failure repair is another interesting problem to be studied. More importantly, the problem of dynamic repair, referring to the flexibility of dynamically changing number of helper nodes (d∈[k: n−1]) is of both practical and theoretical interest.

There is recent attention to the clustered distributed storage systems. A modified version of the proposed construction might be applicable to such clustered systems. Finally, the exact-repair regenerating codes can be viewed in the context of interference alignment problem, where the repair scenario is equivalent to aligning and canceling the interference (mismatch) exists between a failed symbol and a coded symbol of a helper node. Therefore, the techniques and results of this disclosure might be also applicable to the design of interference alignment codes for wireless communication.

It is to be recognized that depending on the example, certain acts or events of any of the techniques described herein can be performed in a different sequence, may be added, merged, or left out altogether (e.g., not all described acts or events are necessary for the practice of the techniques). Moreover, in certain examples, acts or events may be performed concurrently, e.g., through multi-threaded processing, interrupt processing, or multiple processors, rather than sequentially.

In this section the proof of Proposition 2 is presented. From the RHS of (11),

$\begin{matrix} {{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{D}(x)} + {{ind}_{\mathcal{J}}(x)}}\left\lbrack {R^{f}(D)} \right\rbrack}_{x,{\mathcal{J} \smallsetminus {\{ x\}}}}} = {{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{D}(x)} + {{ind}_{\mathcal{J}}(x)}}\left\lbrack {D \cdot \Xi^{f,{(m)}}} \right\rbrack}_{x,{\mathcal{J} \smallsetminus {\{ x\}}}}} = {{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{D}(x)} + {{ind}_{\mathcal{J}}(x)}}{\sum\limits_{\underset{{❘\mathcal{L}❘} = m}{\mathcal{L} \subseteq {\lbrack d\rbrack}}}{D_{x,\mathcal{L}}\  \cdot \Xi_{\mathcal{L},{\mathcal{J}\backslash{\{ x\}}}}^{f,{(m)}}}}}} = {\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{D}(x)} + {{ind}_{\mathcal{J}}(x)}}{\sum\limits_{y \in {{\lbrack d\rbrack} \smallsetminus {({\mathcal{J} \smallsetminus {\{ x\}}})}}}{D_{{{x,{\mathcal{J} \smallsetminus {\{ x\}}}})}\bigcup{\{ y\}}}\  \cdot \Xi_{{{{\mathcal{J}\backslash{\{ x\}}})}\bigcup{\{ y\}}},{\mathcal{J}\backslash{\{ x\}}}}^{f,{(m)}}}}}}}}} & (105) \end{matrix}$ $\begin{matrix} {= {\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{D}(x)} + {{ind}_{\mathcal{J}}(x)}}\left\lbrack {{D_{x,\mathcal{J}}\ \Xi_{\mathcal{J},{\mathcal{J}\backslash{\{ x\}}}}^{f,{(m)}}} + \text{ }{\sum\limits_{y \in {{\lbrack d\rbrack} \smallsetminus \mathcal{J}}}{D_{{{x,{\mathcal{J} \smallsetminus {\{ x\}}}})}\bigcup{\{ y\}}} \cdot \Xi_{{{{\mathcal{J}\backslash{\{ x\}}})}\bigcup{\{ y\}}},{\mathcal{J}\backslash{\{ x\}}}}^{f,{(m)}}}}} \right\rbrack}}} & (106) \end{matrix}$ $\begin{matrix} {= {\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{D}(x)} + {{ind}_{\mathcal{J}}(x)}}\left\lbrack \text{⁠}{{\left( {- 1} \right)^{{\sigma_{D}(x)} + {{ind}_{\mathcal{J}}(x)}}\psi_{f,x}D_{x,\mathcal{J}}} + {\sum\limits_{y \in {{\lbrack d\rbrack} \smallsetminus \mathcal{J}}}{\left( {- 1} \right)^{{\sigma_{D}(x)} + {{ind}_{{({\mathcal{J}\backslash{\{ x\}}})}\bigcup{\{ y\}}}(y)}}\psi_{f,x}D_{{{x,{\mathcal{J}\backslash{\{ x\}}}})}\bigcup{\{ y\}}}}}} \right\rbrack}\text{⁠}}} & (107) \end{matrix}$ $\begin{matrix} {= {{\sum\limits_{x \in \mathcal{J}}{\psi_{f,x}D_{x,\mathcal{J}}}} + {\sum\limits_{y \in {{\lbrack d\rbrack} \smallsetminus \mathcal{J}}}{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{\sigma_{D}(x)} + {\sigma_{D}(y)} + {{ind}_{\mathcal{J}}(x)} + {{ind}_{{({\mathcal{J}\backslash{\{ x\}}})}\bigcup{\{ y\}}}(y)}}\psi_{f,y}D_{{{x,{\mathcal{J}\backslash{\{ x\}}}})}\bigcup{\{ y\}}}}}}}} & (108) \end{matrix}$ $\begin{matrix} {= {{\sum\limits_{x \in \mathcal{J}}{\psi_{f,x}D_{x,\mathcal{J}}}} + {\sum\limits_{y \in {{\lbrack d\rbrack} \smallsetminus \mathcal{J}}}{\sum\limits_{x \in \mathcal{J}}{{\left( {- 1} \right)^{{\sigma_{D}(x)} + {\sigma_{D}(y)} + {ind}_{\mathcal{J}\bigcup{\{ y\}}}}}^{{(y)} + {{ind}_{\mathcal{J}\bigcup{\{ y\}}}(x)} + 1}\psi_{f,y}D_{{{x,{\mathcal{J}\backslash{\{ x\}}}})}\bigcup{\{ y\}}}}}}}} & (109) \end{matrix}$ $\begin{matrix} {= {{\sum\limits_{x \in \mathcal{J}}{\psi_{f,x}D_{x,\mathcal{J}}}} + {\sum\limits_{y \in {{\lbrack d\rbrack} \smallsetminus \mathcal{J}}}{\left( {- 1} \right)^{{\sigma_{D}(y)} + {{ind}_{\mathcal{J}\bigcup{\{ y\}}}(y)} + 1}\text{⁠}\psi_{f,y}{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y\}}}(x)}\left( {- 1} \right)^{\sigma_{D}(x)}D_{{{x,{\mathcal{J}\backslash{\{ x\}}}})}\bigcup{\{ y\}}}}}}}}} & (110) \end{matrix}$ $\begin{matrix} {= {{\sum\limits_{x \in \mathcal{J}}{\psi_{f,x}D_{x,\mathcal{J}}}} + {\sum\limits_{y \in {{\lbrack d\rbrack} \smallsetminus \mathcal{J}}}{\left( {- 1} \right)^{{\sigma_{D}(y)} + {{ind}_{\mathcal{J}\bigcup{\{ y\}}}(y)} + 1}\psi_{f,y}{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y\}}}(x)}w_{x,{\mathcal{J}\bigcup{\{ y\}}}}}}}}}} & (111) \end{matrix}$ $\begin{matrix} {= {{\sum\limits_{x \in \mathcal{J}}{\psi_{f,x}D_{x,\mathcal{J}}}} + {\sum\limits_{y \in {{\lbrack d\rbrack} \smallsetminus \mathcal{J}}}{\left( {- 1} \right)^{{\sigma_{D}(y)} + {{ind}_{\mathcal{J}\bigcup{\{ y\}}}(y)} + 1}{\psi_{f,y}\left\lbrack {\left( {- 1} \right)^{{{ind}_{\mathcal{J}\bigcup{\{ y\}}}(y)} + 1}w_{y,{\mathcal{J}\bigcup{\{ y\}}}}} \right\rbrack}}}}} & (112) \end{matrix}$ $\begin{matrix} {= {{\sum\limits_{x \in \mathcal{J}}{\psi_{f,x}D_{x,\mathcal{J}}}} + {\sum\limits_{y \in {{\lbrack d\rbrack} \smallsetminus \mathcal{J}}}{\left( {- 1} \right)^{{\sigma_{D}(y)} + {{ind}_{\mathcal{J}\bigcup{\{ y\}}}(y)} + 1}{\psi_{f,y}\left\lbrack {\left( {- 1} \right)^{{{ind}_{\mathcal{J}\bigcup{\{ y\}}}(y)} + 1}\left( {- 1} \right)^{\sigma_{D}(y)}D_{y,\mathcal{J}}} \right\rbrack}}}}} & (113) \end{matrix}$ $\begin{matrix} {= {{\sum\limits_{x \in \mathcal{J}}{\psi_{f,x}D_{x,\mathcal{J}}}} + {\sum\limits_{y \in {{\lbrack d\rbrack} \smallsetminus \mathcal{J}}}{\psi_{f,y}D_{y,\mathcal{J}}}}}} & (114) \end{matrix}$ $\begin{matrix} {{= {{\sum\limits_{x \in {\lbrack d\rbrack}}{\psi_{f,x}D_{x,\mathcal{J}}}} = \left\lbrack {\Psi_{f} \cdot D} \right\rbrack_{\mathcal{J}}}},} & (115) \end{matrix}$

where

-   -   In (105) the definition of Ξ^(f,(m)) is from (9), where the         entry         is non-zero only if         includes         \{x}. This implies that for non zero         ,         may satisfy         =(         \{x})∪{y} for some y∈[d]\(         {x});     -   In (106), the summation is split into two cases: y=x and y≠x;     -   In (107),         is replaced by         from its definition in (9);     -   In (108) the two summations over x and y are swapped;     -   In (109), the definition of ind·(⋅) function is used to write

$\begin{matrix} \begin{matrix} {{{{ind}_{\mathcal{J}\bigcup{\{ y\}}}(x)} + {in{d_{\mathcal{J}\bigcup{\{ y\}}}(y)}}} = {{\left\{ {u \in {{\mathcal{J}\bigcup{\left\{ y \right\}\text{:}u}} \leq x}} \right\} } + {\left\{ {u \in {{\mathcal{J}\bigcup{\left\{ y \right\}\text{:}u}} \leq y}} \right\} }}} \\ {= {{\left\{ {u \in {{\mathcal{J}\text{:}u} \leq x}} \right\} } + {1\left\lbrack {y \leq x} \right\rbrack} +}} \\ {{\left\{ {u \in {{\left( {\mathcal{J} \smallsetminus \left\lbrack x \right\}} \right)\bigcup{\left\{ y \right\}\text{:}u}} \leq y}} \right\} } + {1\left\lbrack {x \leq y} \right\rbrack}} \\ {{= {{{ind}_{\mathcal{J}}(x)} + {in{d_{{({\mathcal{J}\backslash{\{ x\}}})}\bigcup{\{ y\}}}(y)}} + 1}},} \end{matrix} & \; \end{matrix}$

where the last equality holds since x∈

and y∈[d]\

, which implies x≠y, and therefore 1[x≤y]+1[y≤x]=1. This leads to

(x)+

≡

+

+1 modulo 2.

-   -   In (111) the definition of D is used from (8): since x∉(         \{x})∪{y} then

$\begin{matrix} {D_{x,{{({\mathcal{J} \smallsetminus {\{ x\}}})}\bigcup{\{ y\}}}} = {\left( {- 1} \right)^{\sigma_{D}{(x)}}{w_{x,{\mathcal{J}\bigcup{\{ y\}}}}.}}} & \; \end{matrix}$ A similar argument is used in (113);

-   -   In (112) the parity equation from (7) is used. In particular,

$\begin{matrix} {{{\sum\limits_{x \in {\mathcal{J}\bigcup{\{ y\}}}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(x)}}w_{x,{I\bigcup{\{ y\}}}}}} = 0},} & \; \end{matrix}$ which implies

$\begin{matrix} {{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(x)}}w_{x,{I\bigcup{\{ y\}}}}}} = {{- \left( {- 1} \right)^{in{d_{J\bigcup{\{ y\}}}{(y)}}}}{w_{y,{I\bigcup{\{ y\}}}}.}}} & \; \end{matrix}$

This completes the proof of Proposition 2.

Remark 9: Note that in the chain of equations above the techniques described herein aim to repair the coded symbol at position

of the failed node, which is a linear combination of symbols in column

of the message matrix. However, the linear combination in (110) misses some of the symbols of column

(i.e.,

when x∉

) and includes symbols from columns of the message matrix (i.e.,

when

≠

). However, these two interference perfectly cancel each other due to the parity equation in (7). This is identical to the notion of interference neutralization, which is well studied in multi-hop wireless networks.

Definition 4: The techniques described herein call a (signed) determinant or cascade code semi-systematic if the first k nodes store symbols from the message matrix, without any encoding. The encoder of a semi-systematic code may consist of a k×k identity matrix in its upper-left and a k×(d−k) zero matrix in its upper-right corner.

Consider an (n, k, d) regenerating code obtained from an encoder matrix Ψ. Here, the techniques described herein show that the techniques described herein can modify the encoder matrix such that the resulting code becomes semi-systematic, that is, the first k nodes store pure symbols from the message matrix. Consider a general encoder matrix

$\Psi_{n \times d} = {\left\lbrack {\Gamma_{n \times k}\ Y_{n \times {({d - k})}}} \right\rbrack = {\begin{bmatrix} A_{k \times k} & B_{k \times {({d - k})}} \\ C_{{({n - k})} \times k} & D_{{({n - k})} \times {({d - k})}} \end{bmatrix}.}}$

Any k rows of Γ_(n×k) are linearly independent. Thus, A_(k×k) is a full-rank and invertible matrix.

$X = \begin{bmatrix} A_{k \times k}^{- 1} & {{- A_{k \times k}^{- 1}}B_{k \times {({d - k})}}} \\ O_{{({d - k})} \times k} & I_{{({d - k})} \times {({d - k})}} \end{bmatrix}$

Note that

${X^{- 1} = \begin{bmatrix} A_{k \times k} & B_{k \times {({d - k})}} \\ O_{{({d - k})} \times k} & I_{{({d - k})} \times {({d - k})}} \end{bmatrix}},$

and hence X is a full-rank matrix.

Therefore, the techniques described herein can modify the encoder matrix to

${\overset{\sim}{\Psi}}_{n \times d} = {{\Psi_{n \times d} \cdot X} = {\begin{bmatrix} I_{k \times k} & O_{k \times {({d - k})}} \\ {CA^{- 1}} & {D - {CA^{- 1}B}} \end{bmatrix} = {\left\lbrack {{\overset{\sim}{\Gamma}}_{n \times k}\ {\overset{\sim}{\Upsilon}}_{n \times {({d - k})}}} \right\rbrack.}}}$

It is easy to verify that {tilde over (Ψ)} satisfy conditions. To this end, let

be an arbitrary set of rows indices with |

|=k. The techniques described herein have {tilde over (Γ)}[

, :]=−Γ[

, :]A_(k×k) ⁻¹ which is a full-rank matrix, since both Γ[

, :] and A_(k×k) ⁻¹ are full-rank. This shows the condition holds for {tilde over (Ψ)}. Similarly, for an arbitrary set

⊆[n] with |

|=d{tilde over (Ψ)}[

, :]=Ψ[

, :]X, which is again full-rank, because both Ψ[

, :] are X full-rank.

The techniques described herein may use the

transform to solve the recursive equation in (33) for

_(m)'s, and evaluate the code parameters in (27), (28), and (32). For the sake of completeness, the techniques described herein start with the definition and some of the main properties of this transformation.

Definition 5: The two-sided

-transform of a sequences x_(m) is defined as

$\begin{matrix} {{X(z)} = {{\mathcal{Z}\left\{ x_{m} \right\}} = {\sum\limits_{m = {- \infty}}^{\infty}{x_{m}z^{- m}}}}} & (116) \end{matrix}$

where z is a complex number. The region of convergence (ROC) of X(z) is defined as the set of points in the complex plane (z∈

) for which X(z) converges, that is,

$\begin{matrix} {{ROC} = \left\{ {{z\text{:}{{\sum\limits_{m = {- \infty}}^{\infty}{x_{m}z^{- m}}}}} < \infty} \right\}} & (117) \end{matrix}$

Definition 6: The inverse

-transform of X(z) is defined as a sequence {x_(m)}_(m=−∞) ^(∞) where

$\begin{matrix} {{x_{m} = {{\mathcal{Z}^{- 1}\left\{ {X(z)} \right\}} = {\frac{1}{2\pi j}{\oint_{C}{{X(z)}z^{m - 1}dz}}}}},{m \in {\mathbb{Z}}},} & (118) \end{matrix}$

where C is a counterclockwise closed path encircling the origin and entirely located in the region of convergence (ROC).

For a given ROC, there is a one-to-one correspondence between the sequences x_(m) and its

-transform, X(z). Some properties of the

-transform as well as some pairs of sequences and their

-transforms are listed in Table 3 and Table 4, respectively.

TABLE 3 Properties of the

-transform. Time Domain Z-Domain ROC Linearity w_(m) = ax_(m) + by_(m) W(z) = aX(z) + bY(z) ROC_(x) ∩ ROC_(y) Convolution w_(m) = x_(m) * y_(m) W(z) = X(z)Y(z) ROC_(x) ∩ ROC_(y) Differentia- tion w_(m) = mx_(m) ${W(z)} = {{- z}\frac{{dX}(z)}{dz}}$ ROC_(x) Scaling in a^(−m)x_(m) X(a · z) ROC_(x)/|a| the z-domain (Generalized) Accumula- tion $w_{m} = {\sum\limits_{t = {- \infty}}^{m}{a^{m - t}x_{t}}}$ ${W(z)} = {\frac{1}{1 - {az}^{- 1}}{X(z)}}$ ROC_(x) ∩ {z: |z| > |a|} Time shifting w_(m) = x_(m−b) W(z) = z^(−b)X(z) ROC_(x)

TABLE 4 Some useful pairs of

-transform. Sequence

-Transform ROC x_(m) = δ(m) X(z) = 1 all z ∈ 

$x_{m}{\quad{= \begin{pmatrix} r \\ m \end{pmatrix}}}$ X(z) = (1 + z⁻¹)^(r) all z ∈ 

${x = {\begin{pmatrix} {m + b - 1} \\ m \end{pmatrix}a^{m}}},{b \in {\mathbb{Z}}^{+}}$ ${X(z)} = \frac{1}{\left( {1 - {az}^{- 1}} \right)^{b}}$ |x| > |a| ${x = {\begin{pmatrix} b \\ m \end{pmatrix}a^{m}}},{b \in {\mathbb{Z}}^{+}}$ X(z) = (1 + az⁻¹)^(b) all z ∈ 

The techniques described herein start from the definition of p_(m) and use (33) to obtain a recursive equation. For any m with m≠0,

$\begin{matrix} {p_{m} = {\ell_{\mu - m} = {\sum\limits_{j = {{({\mu - m})} + 1}}^{\mu}{{\ell_{j} \cdot \left( {j - \left( {\mu - m} \right) - 1} \right)}\begin{pmatrix} {d - k + 1} \\ {j - \left( {\mu - m} \right)} \end{pmatrix}}}}} & (119) \\ {= {\sum\limits_{t = 1}^{m}{{\ell_{t + \mu - m} \cdot \left( {t - 1} \right)}\begin{pmatrix} {d - k + 1} \\ t \end{pmatrix}}}} & (120) \\ {{= {\sum\limits_{t = 1}^{m}{{p_{m - t} \cdot \left( {t - 1} \right)}\begin{pmatrix} {d - k + 1} \\ t \end{pmatrix}}}},} & (121) \end{matrix}$

where (119) is implied by (33), and in (120) used a change of variable t=j−μ+m. Note that the summand in (121) corresponding to

$t = {{0\mspace{14mu}{in}\mspace{14mu}{p_{m - 0} \cdot \left( {0 - 1} \right)}\begin{pmatrix} {d - k + 1} \\ 0 \end{pmatrix}} = {- {p_{m}.}}}$ Hence, by including t=0 in the summation,

$\begin{matrix} {{{\sum\limits_{t = 0}^{m}{{p_{m - t} \cdot \left( {t - 1} \right)}\begin{pmatrix} {d - k + 1} \\ t \end{pmatrix}}} = 0},{m \neq 0.}} & (122) \end{matrix}$

Finally, for m=0,

$\begin{matrix} {{\sum\limits_{t = 0}^{0}{{p_{0 - t} \cdot \left( {t - 1} \right)}\begin{pmatrix} {d - k + 1} \\ t \end{pmatrix}}} = {{- p_{0}} = {{- \ell_{\mu - 0}} = {- 1.}}}} & (123) \end{matrix}$

Putting (122) and (123) together,

$\begin{matrix} {{\sum\limits_{t = 0}^{m}{{p_{m - t} \cdot \left( {t - 1} \right)}\begin{pmatrix} {d - k + 1} \\ t \end{pmatrix}}} = {{- \delta_{m}} \cdot {\forall{m \in {{\mathbb{Z}}.}}}}} & (124) \end{matrix}$

Next, define a sequence

$q_{t} = {\left( {t - 1} \right)\begin{pmatrix} {d - k + 1} \\ t \end{pmatrix}}$ for every integer t. Note that q_(t)=0 for t<0. Then (124) can be rewritten as

$\begin{matrix} {{- \delta_{m}} = {{\sum\limits_{t = 0}^{m}{{p_{m - t} \cdot \left( {t - 1} \right)}\begin{pmatrix} {d - k + 1} \\ t \end{pmatrix}}} = {{\sum\limits_{t = 0}^{m}{p_{m - t} \cdot q_{t}}} = {\sum\limits_{t = {- \infty}}^{\infty}{p_{m - t} \cdot q_{t}}}}}} & (125) \\ {\mspace{79mu}{{= {p_{m}*q_{m}}},}} & (126) \end{matrix}$

where (125) holds since q_(t)=0 for t<0, and p_(m−t)=

_(μ+(t−m))=0 is zero for t>m (see definition of

_(m) in (34)). Here, operator * denotes the convolution between two sequences p_(m) and q_(m). The techniques described herein can take the

-transform from both sides of (126) and use Table 3 and Table 4 to obtain P(z)Q(z)=−1.  (127)

The

-transform of q_(m) can be easily found using the property and pairs used from Table 3 and Table 4 is follows.

$\begin{matrix} {{Q(z)} = {{\mathcal{Z}\left\{ q_{m} \right\}} = {{\mathcal{Z}\left\{ {\left( {m - 1} \right)\begin{pmatrix} {d - k + 1} \\ m \end{pmatrix}} \right\}} = {{\mathcal{Z}\left\{ {m\begin{pmatrix} {d - k + 1} \\ m \end{pmatrix}} \right\}} - {\mathcal{Z}\left\{ \begin{pmatrix} {d - k + 1} \\ m \end{pmatrix} \right\}}}}}} & (128) \\ {\mspace{79mu}{= {{{- z}\;\frac{d\;\mathcal{Z}\left\{ \begin{pmatrix} {d - k + 1} \\ m \end{pmatrix} \right\}}{dz}} - {\mathcal{Z}\left\{ \begin{pmatrix} {d - k + 1} \\ m \end{pmatrix} \right\}}}}} & (129) \\ {\mspace{79mu}{= {{{- z}\frac{d}{dz}\left( {1 + z^{- 1}} \right)^{d - k + 1}} - \left( {1 + z^{- 1}} \right)^{d - k + 1}}}} & (130) \\ {= {{{{- {z\left( {d - k + 1} \right)}}\left( {- z^{- 2}} \right)\left( {1 + z^{- 1}} \right)^{d - k}} - \left( {1 + z^{- 1}} \right)^{d - k + 1}} = {{\left( {1 + z^{- 1}} \right)^{d - k}\left\lbrack {{\left( {d - k} \right)z^{- 1}} - 1} \right\rbrack}.}}} & (131) \end{matrix}$

where (128) holds due to linearity of the

-transform, in (129) the techniques described herein used the differentiation effect, and the techniques described herein used the fourth pair in Table 4 for a=1 and b=d−k+1 in (130). Plugging (131) into (127),

$\begin{matrix} {{{P(z)} = {\frac{- 1}{Q(z)} = {\frac{1}{1 - {\left( {d - k} \right)z^{- 1}}}\left( \frac{1}{1 + z^{- 1}} \right)^{d - k}}}},} & (132) \end{matrix}$

where the region of convergence is given by ROC_(p)={z:|z|>|d−k|}. It remains to find p_(m) from P(z) by computing its inverse

-transform.

$\begin{matrix} {p_{m} = {{\mathcal{Z}^{- 1}\left\{ {P(z)} \right\}} = {\sum\limits_{t = {- \infty}}^{m}{\left( {d - k} \right)^{m - t}\mathcal{Z}^{- 1}\left\{ \left( \frac{1}{1 + z^{- 1}} \right)^{d - k} \right\}}}}} & (133) \\ {= {\sum\limits_{t = {- \infty}}^{m}{{\left( {d - k} \right)^{m - t} \cdot \left( {- 1} \right)^{t}}\begin{pmatrix} {t + d - k - 1} \\ t \end{pmatrix}}}} & (134) \\ {= {\sum\limits_{t = 0}^{m}{\left( {- 1} \right)^{t}\left( {d - k} \right)^{m - t}{\begin{pmatrix} {t + d - k - 1} \\ t \end{pmatrix}.}}}} & (135) \end{matrix}$

where in (133) the techniques described herein used the generalized accumulation rule in Table 3 for a=d−k. It is worth mentioning that the inverse

-transform of

$\left( \frac{1}{1 + z^{- 1}} \right)^{d - k}$ may be taken with respect to variable t. To this end, in (134) the techniques described herein have used the third pair in Table 4 with a=−1 and b=d−k. Finally, in (135) the techniques described herein have limited the range of t by noticing the fact that the binomial coefficient is zero for t<0. This shows the desired identity and completes the proof.

Let us define

${u_{\mu} = {{\sum\limits_{m = {- \infty}}^{\infty}{\ell_{m}\begin{pmatrix} {d + a} \\ {m + b} \end{pmatrix}}} = {\sum\limits_{m = {- \infty}}^{\infty}{p_{\mu - m}\begin{pmatrix} {d + a} \\ {m + b} \end{pmatrix}}}}},{v_{\mu} = {{\sum\limits_{m = {- b}}^{\mu}{\left( {d - k} \right)^{\mu - m}\begin{pmatrix} {k + a} \\ {m + b} \end{pmatrix}}} = {\sum\limits_{m = 0}^{\mu + b}{\left( {d - k} \right)^{\mu + b - m}\begin{pmatrix} {k + a} \\ m \end{pmatrix}}}}},$

for every integer μ. The claim of this lemma is equivalent to u_(μ)=v_(μ) for all μ∈

. Instead of directly showing in the μ-domain, the techniques described herein may prove that the two sequences are identical in the z-domain, and have the same ROCs.

$\begin{matrix} {{U(z)} = {{\mathcal{Z}\left\{ {\sum\limits_{m = {- \infty}}^{\infty}{p_{\mu - m}\begin{pmatrix} {d + a} \\ {m + b} \end{pmatrix}}} \right\}} = {{\mathcal{Z}\left\{ {p_{\mu}*\begin{pmatrix} {d + a} \\ {\mu + b} \end{pmatrix}} \right\}} = {\mathcal{Z}{\left\{ p_{\mu} \right\} \cdot \mathcal{Z}}\left\{ \begin{pmatrix} {d + a} \\ {\mu + b} \end{pmatrix} \right\}}}}} & (136) \\ {\mspace{79mu}{= {{{P(z)} \cdot z^{b}}\mathcal{Z}\left\{ \begin{pmatrix} {d + a} \\ \mu \end{pmatrix} \right\}}}} & (137) \\ {\mspace{79mu}{= {\frac{1}{1 - {\left( {d - k} \right)z^{- 1}}}{\left( {1 + z^{- 1}} \right)^{d + a} \cdot z^{b} \cdot \left( \frac{1}{1 + z^{- 1}} \right)^{d - k}}}}} & (138) \\ {\mspace{79mu}{{= {z^{b}\frac{1}{1 - {\left( {d - k} \right)z^{- 1}}}\left( {1 + z^{- 1}} \right)^{k + a}}},}} & (139) \end{matrix}$

where in (136) and (137) the techniques described herein used the convolution and time-shift properties from Table 3, respectively. Moreover, the techniques described herein have used (132) and the

-transforms in Table 4 to simplify (138). Note that ROC_(u)=ROC_(p)={z:|z|>|d−k|}.

Similarly, for sequence {v_(μ)}

$\begin{matrix} {{V(z)} = {{\mathcal{Z}\left\{ {\sum\limits_{m = 0}^{\mu + b}{\left( {d - k} \right)^{\mu + b - m}\begin{pmatrix} {k + a} \\ m \end{pmatrix}}} \right\}} = {{z^{- {({- b})}} \cdot \mathcal{Z}}\left\{ {\sum\limits_{m = 0}^{\mu}{\left( {d - k} \right)^{\mu - m}\begin{pmatrix} {k + a} \\ m \end{pmatrix}}} \right\}}}} & (140) \\ {\mspace{79mu}{= {{z^{b} \cdot \mathcal{Z}}\left\{ {\sum\limits_{m = {- \infty}}^{\mu}{\left( {d - k} \right)^{\mu - m}\ \begin{pmatrix} {k + a} \\ m \end{pmatrix}}} \right\}}}} & (141) \\ {\mspace{79mu}{= {{z^{b} \cdot \frac{1}{1 - {\left( {d - k} \right)z^{- 1}}}}\mathcal{Z}\left\{ \begin{pmatrix} {k + a} \\ m \end{pmatrix} \right\}}}} & (142) \\ {\mspace{79mu}{= {{z^{b} \cdot \frac{1}{1 - {\left( {d - k} \right)z^{- 1}}}}\left( {1 + z^{- 1}} \right)^{k + a}}}} & (143) \end{matrix}$

where in (140) and (142) the techniques described herein used time-shift property and generalized accumulation property from Table 3, respectively. Moreover, (141) holds because

$\begin{pmatrix} {k + a} \\ m \end{pmatrix}\quad$ is zero for m<0, and (143) follows the pairs of

-transform in Table 4. Also, it is worth noting that the ROC of {u_(μ)} is given by ROC_(v)={z:|z|>|d−k|}, due to the step in (142). Comparing (138) and (143) and their ROCs imply that sequences {u_(μ)} and {v_(μ)} are identical. This completes the proof of the lemma.

Proof of proposition˜\refprop:node:rep: The proof technique here is similar to that used in (47). The techniques described herein start with the RHS of (9), and plugin the entries of matrices R^(f,(m)), Ξ^(f,(m)) and D, to expand it. Next, the techniques described herein split the terms in the summation into v-symbols (

with x∈

) and w-symbols (

with y∉

), and then the techniques described herein prove the identity for v and w symbols separately. The details of the derivation are given at the top of the next page.

$\begin{matrix} {{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}}{(x)}}\left\lbrack R^{f,{(m)}} \right\rbrack}_{x,{\mathcal{J}\backslash{\{ x\}}}}} = {{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}}{(x)}}\left\lbrack {D \cdot \Xi^{f,{(m)}}} \right\rbrack}_{x,{\mathcal{J}\backslash{\{ x\}}}}} = {{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}}{(x)}}{\sum\limits_{\underset{{\mathcal{L}} = m}{\mathcal{L} \subseteq {\lbrack d\rbrack}}}{D_{x,\mathcal{L}} \cdot \Xi_{\mathcal{L},{\mathcal{J}\backslash{\{ x\}}}}^{f,{(m)}}}}}} = {\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}}{(x)}}{\sum\limits_{y \in {{\lbrack d\rbrack}{{\backslash(}{{\mathcal{J}\backslash{\{ x\}}})}}}}^{\;}{D_{{{x,{\mathcal{J}\backslash{\{ x\}}}})}\bigcup{\{ y\}}} \cdot \Xi_{{{{\mathcal{J}\backslash{\{ x\}}})}\bigcup{\{ y\}}},{\mathcal{J}\backslash{\{ x\}}}}^{f,{(m)}}}}}}}}} & (144) \\ {= {\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}}{(x)}}\left\lbrack {{D_{x,\mathcal{J}}\Xi_{\mathcal{J},{\mathcal{J}\backslash{\{ x\}}}}^{f,{(m)}}} + {\sum\limits_{y \in {{\lbrack d\rbrack}\backslash\mathcal{J}}}{D_{{{x,{\mathcal{J}\backslash{\{ x\}}}})}\bigcup{\{ y\}}} \cdot \Xi_{{{{\mathcal{J}\backslash{\{ x\}}})}\bigcup{\{ y\}}},{\mathcal{J}\backslash{\{ x\}}}}^{f,{(m)}}}}} \right\rbrack}}} & (145) \\ {= {\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}}{(x)}}\left\lbrack {{\left( {- 1} \right)^{{ind}_{\mathcal{J}}{(x)}}\psi_{f,x}D_{x,\mathcal{J}}} + {\sum\limits_{y \in {{\lbrack d\rbrack}\backslash\mathcal{J}}}{\left( {- 1} \right)^{{ind}_{{({\mathcal{J}\backslash{\{ x\}}})}\bigcup{\{ y\}}}{(y)}}\psi_{f,y}D_{{{x,{\mathcal{J}\backslash{\{ x\}}}})}\bigcup{\{ y\}}}}}} \right\rbrack}}} & (146) \\ {= {{\sum\limits_{x \in \mathcal{J}}{\psi_{f,y}D_{x,\mathcal{J}}}} + {\sum\limits_{y \in {{\lbrack d\rbrack}\backslash\mathcal{J}}}{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}}{(x)}}\left( {- 1} \right)^{{ind}_{{({\mathcal{J}\backslash{\{ x\}}})}\bigcup{\{ y\}}}{(y)}}\psi_{f,y}\; D_{{{x,{\mathcal{J}\backslash{\{ x\}}}})}\bigcup{\{ y\}}}}}}}} & (147) \\ {= {{\sum\limits_{x \in \mathcal{J}}{\psi_{f,y}D_{x,\mathcal{J}}}} + {\sum\limits_{y \in {{\lbrack d\rbrack}\backslash\mathcal{J}}}{\sum\limits_{x \in \mathcal{J}}{{\psi_{f,y}\left( {- 1} \right)}^{{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(y)}} + 1}\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(x)}}D_{{{x,{\mathcal{J}\backslash{\{ x\}}}})}\bigcup{\{ y\}}}}}}}} & (148) \\ {= {{\sum\limits_{x \in \mathcal{J}}{\psi_{f,y}D_{x,\mathcal{J}}}} + {\sum\limits_{y \in {{\lbrack d\rbrack}\backslash\mathcal{J}}}{\left( {- 1} \right)^{{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(y)}} + 1}\psi_{f,y}{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(x)}}w_{x,{\mathcal{J}\bigcup{\{ y\}}}}}}}}}} & (149) \\ {= {{\sum\limits_{x \in \mathcal{J}}{\psi_{f,y}D_{x,\mathcal{J}}}} + {\sum\limits_{y \in {{\lbrack d\rbrack}\backslash\mathcal{J}}}{\left( {- 1} \right)^{{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(y)}} + 1}{\psi_{f,y}\left\lbrack {\left( {- 1} \right)^{{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(y)}} + 1}w_{y,{\mathcal{J}\bigcup{\{ y\}}}}} \right\rbrack}}}}} & (150) \\ {= {{\sum\limits_{x \in \mathcal{J}}{\psi_{f,y}D_{x,\mathcal{J}}}} + {\sum\limits_{y \in {{\lbrack d\rbrack}\backslash\mathcal{J}}}{\left( {- 1} \right)^{{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(y)}} + 1}{\psi_{f,y}\left\lbrack {\left( {- 1} \right)^{{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(y)}} + 1}D_{y,\mathcal{J}}} \right\rbrack}}}}} & (151) \\ {\mspace{79mu}{= {{\sum\limits_{x \in \mathcal{J}}{\psi_{f,y}D_{x,\mathcal{J}}}} + {\sum\limits_{y \in {{\lbrack d\rbrack}\backslash\mathcal{J}}}{\psi_{f,y}D_{y,\mathcal{J}}}}}}} & (152) \\ {\mspace{79mu}{= {{\sum\limits_{x \in {\lbrack d\rbrack}}{\psi_{f,y}D_{x,\mathcal{J}}}} = \left\lbrack {\psi_{f}D} \right\rbrack_{\mathcal{J}}}}} & (153) \end{matrix}$

The critical steps of the proof can be justified as follows.

-   -   In (144), the definition of Ξ^(f,(m)) from (7) is used, which         implies         is non-zero only if         includes         \{x};     -   In (145), the summation is split into two cases: y=x and y≠x;     -   In (146),         is replaced by         from its definition in (7);     -   In (147), the two summations over x and y are swapped;     -   In (148), the identity

$\begin{matrix} {{\left( {- 1} \right)^{{ind}_{{({\mathcal{J}\backslash{\{ x\}}})}\bigcup{\{ y\}}}{(y)}}\left( {- 1} \right)^{in{d_{\mathcal{J}}{(x)}}}} = {\left( {- 1} \right)^{{{ind}_{({\mathcal{J}\bigcup{\{ y\}}})}{(y)}} + 1}\left( {- 1} \right)^{in{d_{\mathcal{J}\bigcup{\{ y\}}}{(x)}}}}} & \; \end{matrix}$ is used. In order to prove the identity, consider two cases:

-   -   If x<y, then

$\left\{ {\begin{matrix} {{{{ind}_{{({\mathcal{J}\backslash{\{ x\}}})}\bigcup{\{ y\}}}(y)} = {{{ind}_{\mathcal{J}\bigcup{\{ y\}}}(y)} - 1}},} \\ {{{ind}_{\mathcal{J}}(x)} = {{ind}_{\;_{\mathcal{J}\bigcup{\{ y\}}}}(x)}} \end{matrix}.} \right.$

-   -   If x>y, then

$\left\{ {\begin{matrix} {{{{ind}_{{({\mathcal{J}\backslash{\{ x\}}})}\bigcup{\{ y\}}}(y)} = {{ind}_{\mathcal{J}\bigcup{\{ y\}}}(y)}},} \\ {{{ind}_{\mathcal{J}}(x)} = {{{ind}_{\;_{\mathcal{J}\bigcup{\{ y\}}}}(x)} - 1}} \end{matrix}.} \right.$

-   -   In (149), since x∉(         \{x})∪{y} then

$\begin{matrix} {{D_{x,{{({\mathcal{J} \smallsetminus {\{ x\}}})}\bigcup{\{ y\}}}} = w_{x,{\mathcal{J}\bigcup{\{ y\}}}}};} & \; \end{matrix}$

-   -   In (150), the parity equation (5) is used. In particular,

$\begin{matrix} {{{\sum\limits_{x \in {\mathcal{J}\bigcup{\{ y\}}}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(x)}}w_{x,{I\bigcup{\{ y\}}}}}} = 0},} & \; \end{matrix}$ which implies

$\begin{matrix} {{\sum\limits_{x \in \mathcal{J}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(x)}}w_{x,{I\bigcup{\{ y\}}}}}} = {{- \left( {- 1} \right)^{in{d_{J\bigcup{\{ y\}}}{(y)}}}}{w_{y,{I\bigcup{\{ y\}}}}.}}} & \; \end{matrix}$

This completes the proof.

Proof of Proposition˜\reflm:beta: In order to show that the repair bandwidth constraint is fulfilled, the techniques described herein may show that the rank of matrix Ξ^(f,(m)) is at most

$\beta^{(m)} = {\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}.}$ First, note that it is easy to verify the claim for m=1, since the matrix Ξ^(f,(1)) has only one column labeled by ø and hence its rank is at most

$1 = {\begin{pmatrix} {d - 1} \\ {1 - 1} \end{pmatrix}.}$ For m>1, the techniques described herein partition the columns of the matrix into 2 disjoint groups of size

${\beta^{(m)} = {{{\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}\mspace{14mu}{and}\mspace{14mu}\begin{pmatrix} d \\ {m - 1} \end{pmatrix}} - \beta^{(m)}} = \begin{pmatrix} {d - 1} \\ {m - 2} \end{pmatrix}}},$ and show that each column in the second group can be written as a linear combination of the columns in the first group. This implies that the rank of the matrix does not exceed the number of columns in the first group, which is exactly β^((m)).

To form the groups, the techniques described herein pick some x∈[d] such that ψ_(f,x)≠0. Then the first group is the set of all columns whose label is a subset of [d]\{x}. Recall that columns of Ξ^(f,(m)) are labeled with (m−1)-element subsets of [d]. Hence, the number of columns in the first group is

$\begin{pmatrix} {d - 1} \\ {m - 1} \end{pmatrix}.$ Then, the second group is formed by those columns for which x appears in their label.

Without loss of generality, x=d, i.e ψ_(f,d)≠0, and hence the first group consists of columns

such that

⊂[d−1], and the second group includes those

's such that d∈

. For every

with d∈

,

$\begin{matrix} {{\Xi_{:{,\mathcal{J}}}^{f,{(m)}} = {\left( {- 1} \right)^{m}\psi_{f,d}^{- 1}{\sum\limits_{y \in {{\lbrack{d - 1}\rbrack}\backslash\mathcal{J}}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(y)}}\psi_{f,y}\Xi_{:{,{\mathcal{J}\bigcup{\{ y\}}}}}^{f,{(m)}}}}}},} & (154) \end{matrix}$

where

=

\{d}. Note that all the columns appear in the RHS of (154) belong to the first group. Given the facts that |

|=m−1 and

(d)=m−1, the equation in (154) is equivalent to

$\begin{matrix} {{\sum\limits_{y \in {{\lbrack d\rbrack}\backslash\mathcal{J}}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(y)}}\psi_{f,y}\Xi_{:{,{\mathcal{J}\bigcup{\{ y\}}}}}^{f,{(m)}}}} = 0.} & (155) \end{matrix}$

Let us focus on an arbitrarily chosen row of the matrix, labeled by

, where

⊆[d] with |

|=m. The

-th entry of the column in the LHS of (155) is given by

$\left\lbrack {\sum\limits_{y \in {{\lbrack d\rbrack} \smallsetminus \mathcal{J}}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(y)}}\psi_{f,y}\Xi_{:{,{\mathcal{J}\bigcup{\{ y\}}}}}^{f,{(m)}}}} \right\rbrack_{\mathcal{L}} = {\sum\limits_{y \in {{\lbrack d\rbrack} \smallsetminus \mathcal{J}}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(y)}}\psi_{f,y}{\Xi_{\mathcal{L},{\mathcal{J}\bigcup{\{ y\}}}}^{f,{(m)}}.}}}$

First assume

⊂

. This together with the definition of Ξ^(f,(m)) imply that

=0 for any y, and hence all the terms in the LHS of (155) are zero.

Next, consider an

such that

⊆

. Since |

|=|

\{d}|=m−2 and |

|=m, the techniques described herein have

=

∪{y₁, y₂}, where y₁<y₂ are elements of [d]. Note that for y∉{y₁, y₂} the techniques described herein have

=0, since

∪{y}⊂

. Therefore, (155) can be simplified as

$\begin{matrix} {\left\lbrack {\sum\limits_{y \in {{\lbrack d\rbrack} \smallsetminus \mathcal{J}}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(y)}}\psi_{f,y}\Xi_{:{,{\mathcal{J}\bigcup{\{ y\}}}}}^{f,{(m)}}}} \right\rbrack_{\mathcal{L}} = {\sum\limits_{y \in {\{{y_{1},y_{2}}\}}}{\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y\}}}{(y)}}\psi_{f,y}\Xi_{\mathcal{L},{\mathcal{J}\bigcup{\{ y\}}}}^{f,{(m)}}}}} & (156) \\ {= {{{\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y_{1}\}}}{(y_{1})}}\psi_{f,y_{1}}\Xi_{\mathcal{L},{\mathcal{J}\bigcup{\{ y_{1}\}}}}^{f,{(m)}}} + {\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y_{2}\}}}{(y_{2})}}\psi_{f,y_{2}}\Xi_{\mathcal{L},{\mathcal{J}\bigcup{\{ y_{2}\}}}}^{f,{(m)}}}} = {{\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y_{1}\}}}{(y_{1})}}{\psi_{f,y_{1}} \cdot \left( {- 1} \right)^{{ind}_{\mathcal{L}}{(y_{2})}}}\psi_{f,y_{2}}} + {\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ y_{2}\}}}{(y_{2})}}{\psi_{f,y_{2}} \cdot \left( {- 1} \right)^{{ind}_{\mathcal{L}}{(y_{1})}}}\psi_{f,y_{1}}}}}} & (157) \\ {{= {{\psi_{f,y_{1}}{\psi_{f,y_{2}}\left\lbrack {\left( {- 1} \right)^{{{ind}_{\mathcal{L}\backslash{\{ y_{2}\}}}{(y_{1})}} + {{ind}_{\mathcal{L}}{(y_{2})}}} + \left( {- 1} \right)^{{{ind}_{\mathcal{L}\backslash{\{ y_{1}\}}}{(y_{2})}} + {{ind}_{\mathcal{L}}{(y_{1})}}}} \right\rbrack}} = 0}},} & (158) \end{matrix}$

where (156) and (157) is due to the definition of Ξ^(f,(m)), and in (158) the techniques described herein used the facts that

and

which holds for y₁, y₂∈

with y₁<y₂. This completes the proof.

Proof of Proposition˜\refprop:multi-beta: The claim of this proposition for e>d is equivalent to bounding the number of repair symbols from the helper node by

${\alpha = {\begin{pmatrix} d \\ m \end{pmatrix}\mspace{14mu}\left( {{{because}\mspace{14mu}\begin{pmatrix} {d - e} \\ m \end{pmatrix}} = 0} \right)}},$ which is clearly true since each storage node does not store more than α symbols. Thus, the techniques described herein can limit the attention to e≤d. In order to prove the claim, the techniques described herein show that the row rank of

does not exceed

$\begin{pmatrix} d \\ m \end{pmatrix} - {\begin{pmatrix} {d - e} \\ m \end{pmatrix}.}$ Recall that

is a

$\begin{pmatrix} d \\ m \end{pmatrix} \times {e\begin{pmatrix} d \\ {m - 1} \end{pmatrix}}$ matrix, an it suffices to identify

$\begin{pmatrix} {d - e} \\ m \end{pmatrix}\quad$ linearly independent vectors in the left null-space of

. To this end, the techniques described herein introduce a full-rank matrix

of sized

$\begin{pmatrix} {d - e} \\ m \end{pmatrix} \times \begin{pmatrix} d \\ m \end{pmatrix}$ and show that

Step 1 (Construction of

): Let Ψ[

, :] be the e×d matrix obtained from the rows f₁, f₂, . . . , f_(e) of the encoder matrix Ψ. Recall that Ψ[

, :] is full-rank (since any d rows of Ψ are linearly independent, and e≤d). Hence, there exists a subset Q with |

|=e of the columns of Ψ[

, :], denoted by Ψ[

,

] such that det(Ψ[

,

])≠0.

The desired matrix

is of size

${\begin{pmatrix} {d - e} \\ m \end{pmatrix} \times \begin{pmatrix} d \\ m \end{pmatrix}}.$ The techniques described herein label its rows by m-element subsets of [d]\

, and its columns by m-element subsets of [d]. Then the entry at row

and column

is defined as

$\begin{matrix} {Y_{\mathcal{J},\mathcal{L}}^{ɛ,{(m)}} = \left( {\begin{matrix} {\left( {- 1} \right)^{\sigma}{\det\left( {\Psi\left\lbrack {ɛ,{\left( {\mathcal{J}\bigcup} \right)\backslash\mathcal{L}}} \right\rbrack} \right)}} & {{{{if}\mspace{14mu}\mathcal{L}} \subseteq {\mathcal{J}\bigcup}},} \\ 0 & {{{if}\mspace{14mu}\mathcal{L}} \nsubseteq {\mathcal{J}\bigcup}} \end{matrix}.} \right.} & (159) \end{matrix}$

where σ=

(j). Note that

⊆[d]\

, and hence |

∪

|=m+e.

Step 2 (Orthogonality of

to

): The techniques described herein prove this claim for each segment of

. More precisely, for each f∈

, the techniques described herein prove

·Ξ^(f,(m))=0. Consider some f

, and arbitrary indices

and

for rows and columns, respectively.

$\begin{matrix} {\mspace{79mu}\left\lbrack {{Y^{ɛ,{(m)}} \cdot} = {\sum\limits_{\underset{{\mathcal{L}} = m}{\mathcal{L} \subseteq {\lbrack d\rbrack}}} \cdot}} \right.} & (160) \\ {\mspace{79mu}{= {\sum\limits_{x \in {{\lbrack d\rbrack}\backslash\mathcal{J}}} \cdot}}} & (161) \\ {\mspace{79mu}{= {\cdot \Xi_{{\mathcal{J}\bigcup{\{ x\}}},\mathcal{J}}^{f,{(m)}}}}} & (162) \\ {\mspace{79mu}{= \left\lbrack \left( {{- 1} \times} \right. \right.}} & (163) \\ {\det\left( {\Psi\left\lbrack {ɛ,{(\bigcup){{\backslash(}{{\left. \left. \left. \left. {\mathcal{J}\bigcup\left\{ x \right\}} \right) \right\rbrack \right) \right\rbrack\left\lbrack {\left( {- 1} \right)^{{ind}_{\mathcal{J}\bigcup{\{ x\}}}{(x)}}\psi_{f,x}} \right\rbrack} = {\left( {- 1} \right.\left\lbrack \left( {\times {\det\left( {\Psi\left\lbrack {ɛ,{(\bigcup){{\backslash(}\left. {\left. \left. \left. {\mathcal{J}\bigcup\left\{ x \right\}} \right) \right\rbrack \right)\psi_{f,x}} \right\rbrack}}} \right.} \right.}} \right. \right.}}}}} \right.} \right.} & (164) \\ {= {\left( {- 1} \right)^{{\sum\limits_{j \in \mathcal{J}}{{ind}_{\bigcup}{(j)}}} - 1}{\det\left( \begin{bmatrix} {\Psi\left\lbrack {f,{(\bigcup)\backslash\mathcal{J}}} \right\rbrack} \\ {\Psi\left\lbrack {ɛ,{(\bigcup)\backslash\mathcal{J}}} \right\rbrack} \end{bmatrix} \right)}}} & (165) \\ {\mspace{79mu}{= 0.}} & (166) \end{matrix}$

Note that

-   -   In (161) the techniques described herein have used the fact that         μ^(f,(m)) is non-zero only if         =         ∪{x} for some x∈[d]\         .     -   The range of x is further limited in (162) due to the fact that         is non-zero only if         ∪{x}⊆         ∪         , which implies x∈(         ∪         )\         .     -   In (163), the entries of the matrix product are replaced by         their definitions.     -   The equality in (164) is obtained by factoring         , and using the facts that         ⊂         ∪         and

(x) + (x) ≡ ind_(⋃)(x) − ind_(𝒥⋃{x})(x)(mod 2) = {y ∈ ⋃:  y ≤ x} − {y ∈ ⋃{x}:  y ≤ x} = {y ∈ ⋃:  y ≤ x} − {y ∈ :  y ≤ x} − 1 = {y ∈ (⋃1 = (x) − 1.

-   -   The equality in (73) follows the determinant expansion of the         matrix with respect to its first row. Note that |(         ∪         )\         |=e+1, and hence it is a square matrix.     -   Finally, the determinant in (73) is zero, because f∈         , and hence the matrix has two identical rows.

Step 3 (Full-rankness of

): Recall that rows and columns of

are labeled by m-element subsets of [d]\

and m-element subsets of [d], respectively. Consider the sub-matrix of Y

^(,(m)), whose column labels are subsets of [d]\

. This is

$\begin{pmatrix} {d - e} \\ m \end{pmatrix} \times \begin{pmatrix} {d - e} \\ m \end{pmatrix}$ square sub-matrix. Note that for entry at position (

,

) with

≠

, since

∩

=Ø, the techniques described herein have

⊆

∪

, and hence

=0 (see (67)). Otherwise, if

=

the techniques described herein have

$\left\lbrack Y^{ɛ,{(m)}} \right\rbrack_{\mathcal{J},\mathcal{J}} = {\left( {- 1} \right){\sum\limits_{i \in \mathcal{J}}{{{ind}_{\mathcal{J}\bigcup Q}(i)}{{\det\left( {\Psi\left\lbrack {ɛ,Q} \right\rbrack} \right)}.}}}}$ That is

$= \left( \begin{matrix}  & {{{{if}\mspace{14mu}} = \mathcal{J}},} \\ 0 & {{{if}\mspace{14mu}} \neq {\mathcal{J}.}} \end{matrix} \right.$

This implies that Y

^(,(m)) has a diagonal sub-matrix, with diagonal entries ±det(Ψ[

,

]) which are non-zero (see Step 1), and hence Y

^(,(m)) is a full-rank matrix. Therefore, the rows of Y

^(,(m)) provide

$\begin{pmatrix} {d - e} \\ m \end{pmatrix}\quad$ linearly independent vectors in the left null-space of

, and thus the rank of

does not exceed

$\beta^{(m)} = {\begin{pmatrix} d \\ m \end{pmatrix} - {\begin{pmatrix} {d - e} \\ m \end{pmatrix}.}}$ This completes the proof.

In this section, the techniques described herein prove Theorem 3. As mentioned before, this result is essentially obtained from Theorem 2, by exploiting the fact that in the centralized repair setting once one failed node is repaired, it can also participate in the repair process of the remaining failed nodes.

Proof of Theorem˜\refthm:MulRep-improved. Consider a set of e failed nodes ε={f₁, f₂, . . . , f_(e)}, which are going to be repaired by a set of helper nodes

with |

|=d. Recall from Theorem 2 that the repair data of node h intended for a failed node f (i.e., Ψ_(h)·D·Ξ^(f,(m))) can be retrieved from the repair data that h sends for the repair of a set of failed nodes

(i.e., Ψ_(h)·D·

) where f∈

. The techniques described herein use the following procedure in order to repair the failed nodes in

.

1. First node f₁ is repaired using helper nodes

={h₁, h₂, . . . , h_(d)}.

2. Having failed {f₁, . . . , f_(i)} repaired, the repair process of failed node f_(i+1) is performed using helper nodes

_(i)={f₁, . . . , f_(i)}∪{h_(i+1), h_(i+2), . . . , h_(d)}. This step may be repeated for i=2,3, . . . , e.

Note that the proposed repair process introduced in this disclosure is helper-independent, and hence the repair data sent to a failed node f_(i) by a helper node h does not depend on the identity of the other helper nodes.

Using the procedure described above, helper node h_(i) only participates in the repair of failed nodes {f₁, f₂, . . . , f_(i)}, for i=1, 2, . . . , e, while the other helper nodes (i.e., h_(i) for i=e+1, . . . , d) contribute in the repair of all the e failed nodes. Hence, the total repair data downloaded from the helper nodes in

to the central repair unit is given by

$\begin{matrix} {{\sum\limits_{j = 1}^{e}\beta_{j}^{(m)}} + {\left( {d - e} \right)\beta_{e}^{(m)}}} & (167) \\ {= {{{\sum\limits_{j = 1}^{e}\left\lbrack \ {\begin{pmatrix} d \\ m \end{pmatrix} - \ \begin{pmatrix} {d - j} \\ m \end{pmatrix}} \right\rbrack} + {\left( {d - e} \right)\left\lbrack \ {\begin{pmatrix} d \\ m \end{pmatrix} - \ \begin{pmatrix} {d - e} \\ m \end{pmatrix}} \right\rbrack}} = {{d\begin{pmatrix} d \\ m \end{pmatrix}} - {\sum\limits_{j = 1}^{e}\begin{pmatrix} {d - j} \\ m \end{pmatrix}} - {\left( {d - e} \right)\begin{pmatrix} {d - e} \\ m \end{pmatrix}}}}} & (168) \\ {\mspace{79mu}{= {{d\begin{pmatrix} d \\ m \end{pmatrix}} - \left\lbrack \ {\begin{pmatrix} d \\ {m + 1} \end{pmatrix} - \ \begin{pmatrix} {d - e} \\ {m + 1} \end{pmatrix}} \right\rbrack - {\left( {d - e} \right)\begin{pmatrix} {d - e} \\ m \end{pmatrix}}}}} & (169) \\ {= {{\left( {d + 1} \right)\ \begin{pmatrix} d \\ m \end{pmatrix}} - \left\lbrack \ {\begin{pmatrix} d \\ m \end{pmatrix} + \ \begin{pmatrix} d \\ {m + 1} \end{pmatrix}} \right\rbrack - {\left( {d - e + 1} \right)\begin{pmatrix} {d - e} \\ m \end{pmatrix}} + \left\lbrack \ {\begin{pmatrix} {d - e} \\ m \end{pmatrix} + \ \begin{pmatrix} {d - e} \\ {m + 1} \end{pmatrix}} \right\rbrack}} & (170) \\ {= {{\left( {m + 1} \right)\ \begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix}} - \begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix} - {\left( {m + 1} \right)\begin{pmatrix} {d - e + 1} \\ {m + 1} \end{pmatrix}} + \begin{pmatrix} {d - e + 1} \\ {m + 1} \end{pmatrix}}} & (171) \\ {\mspace{79mu}{{= {m\left\lbrack \ {\begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix} - \ \begin{pmatrix} {d - e + 1} \\ {m + 1} \end{pmatrix}} \right\rbrack}},}} & (172) \end{matrix}$

where

-   -   in (77) use the identity

${{\sum\limits_{j = a}^{b}\begin{pmatrix} j \\ m \end{pmatrix}} = {{{\sum\limits_{j = m}^{b}\begin{pmatrix} j \\ m \end{pmatrix}} - {\sum\limits_{j = m}^{a - 1}\begin{pmatrix} j \\ i \end{pmatrix}}} = {\begin{pmatrix} {b + 1} \\ {m + 1} \end{pmatrix} - \begin{pmatrix} a \\ {m + 1} \end{pmatrix}}}},$

-   -   and the equality in (171) holds due to the Pascal identity

${{\begin{pmatrix} a \\ m \end{pmatrix} + \begin{pmatrix} a \\ {m + 1} \end{pmatrix}} = \begin{pmatrix} {a + 1} \\ {m + 1} \end{pmatrix}},$ and the fact that

${\left( {a + 1} \right)\begin{pmatrix} a \\ m \end{pmatrix}} = {\left( {m + 1} \right){\begin{pmatrix} {a + 1} \\ {m + 1} \end{pmatrix}.}}$ Hence the average (per helper node) repair bandwidth is given by

$\begin{matrix} {{\overset{\_}{\beta}}_{e}^{(m)} = {{\frac{1}{d}\left\lbrack {{m\ \begin{pmatrix} {d + 1} \\ {m + 1} \end{pmatrix}} - {m\ \begin{pmatrix} {d - e + 1} \\ {m + 1} \end{pmatrix}}} \right\rbrack}.}} & (173) \end{matrix}$

Note that the repair strategy described here is asymmetric, i.e., the repair bandwidth of helper nodes are different. However, it can be simply symmetrized by concatenating d copies of the code to form a super code

=Ψ·[D ^([1]) ,D ^([2]) , . . . ,D ^([d])].

The participation of the helper nodes in the multiple failure repair of the super-code. Each cell labeled by h_(i) and

shows the set of failed nodes receive repair data from helper node h_(i) to repair their codeword segment corresponding to code segment

.

In the super code, each node stores a total of d·α^((m)) symbols, including α symbols for each code segment

, and the total storage capacity of the code is d·F^((m)). In a multiple failure scenario with failed nodes

={f₁, . . . , f_(e)} and helper nodes

={h₁, . . . , h_(d)}, codeword segments may be repaired separately. The role of helper nodes in the repair process changes in a circular manner. Then, the per-node repair bandwidth of the super code is exactly d·β _(e) ^((m)) defined above. Note that the symmetry in the super code is obtained at the expense of the sub-packetization, which is scaled by a factor of d. This completes the proof.

FIG. 8 is a conceptual diagram illustrating the participation of the helper nodes in the multiple failure repair of the super-code, in accordance with the techniques described herein. Each cell labeled by h_(i) and D[^(l)] shows the set of failed nodes receive repair data from helper node h_(i) to repair their codeword segment corresponding to code segment D[^(l)].

FIG. 9 is a block diagram of a detailed view of a node device that may be configured to perform one or more techniques in accordance with the current disclosure. FIG. 9 illustrates only one particular example of node device 12, and many other examples of node device 12 may be used in other instances and may include a subset of the components included in example node device 12 or may include additional components not shown in FIG. 9. For instance, node device 12 may include a battery or other power component or may not include a direct input component.

As shown in the example of FIG. 9, node device 12 includes one or more processors 60, one or more input components 62, one or more communication units 64, one or more output components 66, and one or more storage components 68. Storage components 68 of node device 12 include failure module 16. Communication channels 70 may interconnect each of the components 60, 64, 62, 66, and 68 for inter-component communications (physically, communicatively, and/or operatively). In some examples, communication channels 70 may include a system bus, a network connection, an inter-process communication data structure, or any other method for communicating data.

One or more communication units 64 of node device 12 may communicate with external devices via one or more wired and/or wireless networks by transmitting and/or receiving network signals on the one or more networks. Examples of communication units 64 include a network interface card (e.g. such as an Ethernet card), an optical transceiver, a radio frequency transceiver, a GPS receiver, or any other type of device that can send and/or receive information. Other examples of communication units 64 may include short wave radios, cellular data radios, wireless network radios, as well as universal serial bus (USB) controllers. Communication units 64 may be configured to operate in accordance with a wireless protocol, such as WiFi®, Bluetooth®, LTE, or ZigBee®.

One or more input components 62 of node device 12 may receive input. Examples of input are tactile, audio, and video input. Input components 62 of node device 12, in one example, includes a presence-sensitive input device (e.g., a touch sensitive screen, a PSD), mouse, keyboard, voice responsive system, video camera, microphone or any other type of device for detecting input from a human or machine. In some examples, input components 62 may include one or more sensor components one or more location sensors (GPS components, Wi-Fi components, cellular components), one or more temperature sensors, one or more movement sensors (e.g., accelerometers, gyros), one or more pressure sensors (e.g., barometer), one or more ambient light sensors, and one or more other sensors (e.g., microphone, camera, infrared proximity sensor, hygrometer, and the like). Other sensors may include a heart rate sensor, magnetometer, glucose sensor, hygrometer sensor, olfactory sensor, compass sensor, step counter sensor, to name a few other non-limiting examples.

One or more output components 66 of node device 12 may generate output. Examples of output are tactile, audio, and video output. Output components 66 of node device 12, in one example, includes a PSD, sound card, video graphics adapter card, speaker, cathode ray tube (CRT) monitor, liquid crystal display (LCD), or any other type of device for generating output to a human or machine.

One or more processors 60 may implement functionality and/or execute instructions associated with node device 12. Examples of processors 60 include application processors, display controllers, auxiliary processors, one or more sensor hubs, and any other hardware configure to function as a processor, a processing unit, or a processing device. Module 16 may be operable by processors 60 to perform various actions, operations, or functions of node device 12. For example, processors 60 of node device 12 may retrieve and execute instructions stored by storage components 68 that cause processors 60 to perform the operations of module 16. The instructions, when executed by processors 60, may cause node device 12 to store information within storage components 68.

One or more storage components 68 within node device 12 may store information for processing during operation of node device 12 (e.g., node device 12 may store data accessed by module 16 during execution at node device 12). In some examples, storage component 68 is a temporary memory, meaning that a primary purpose of storage component 68 is not long-term storage. Storage components 68 on node device 12 may be configured for short-term storage of information as volatile memory and therefore not retain stored contents if powered off. Examples of volatile memories include random-access memories (RAM), dynamic random-access memories (DRAM), static random-access memories (SRAM), and other forms of volatile memories known in the art.

Storage components 68, in some examples, also include one or more computer-readable storage media. Storage components 68 in some examples include one or more non-transitory computer-readable storage mediums. Storage components 68 may be configured to store larger amounts of information than typically stored by volatile memory. Storage components 68 may further be configured for long-term storage of information as non-volatile memory space and retain information after power on/off cycles. Examples of non-volatile memories include magnetic hard discs, optical discs, floppy discs, flash memories, or forms of electrically programmable memories (EPROM) or electrically erasable and programmable (EEPROM) memories. Storage components 68 may store program instructions and/or information (e.g., data) associated with modules 4 and 6. Storage components 68 may include a memory configured to store data or other information associated with module 16.

In accordance with the techniques described herein, node device 12 may be a helper node within a distributed storage system that includes a plurality of nodes as described throughout this disclosure. A total number of nodes in the distributed storage system is represented by n, a file stored in the distributed storage system is recovered from a subset of a number of nodes represented by k upon a file failure on a node in the distributed storage system, and a failed node in the plurality of nodes is recovered from a number of helper nodes of the plurality of nodes represented by d.

Some entity in the distributed storage system may detect a failure in a first node of the distributed storage system. Upon this detection, failure module 16, for a particular mode of a determinant code, the particular mode represented by m, determines a repair-encoder matrix having a number of rows based on a number of m-element subsets of d and having a number of columns based on a number of m−1-element subsets of d.

Failure module 16 multiplies a content matrix for the respective helper node by the repair-encoder matrix to obtain a repair matrix. A maximum number represented by b columns of the repair matrix are linearly independent, where b is based on a number of m−1-element subsets of d−1. Failure module 16 extracts each linearly independent column of the repair matrix and sends, using communication unit 64, the linearly independent columns of the repair matrix to the first node.

In some examples, the content matrix is a product of an encoder matrix and a message matrix. The encoder matrix is common to each of the helper nodes, and the message matrix is unique for every helper node. The encoder matrix may be a fixed matrix having n rows and d columns, and the encoder matrix may be maximum-distance-separable. The message matrix may have d rows, and one or more entries of the message matrix may be one or more of a source symbol or a parity symbol.

In some examples, the number of rows in the repair-encoder matrix may be equal to the number of m-element subsets of d and the number of columns in the repair-encoder matrix may be equal to the number of m−1-element subsets of d.

In some examples, b is equal to a number of m−1-element subsets of d−1.

In some examples, in sending the linearly independent columns of the repair matrix to the first node, failure module 16 may send only the linearly independent columns of the repair matrix to the first node, where the linearly independent columns of the repair matrix may form a repair space of the first node.

In some examples, each linearly independent column may be a repair-data vector.

In some examples, in detecting the failure in the first node, failure module 16 may detect a failure in each of a group of two or more nodes in the plurality of nodes, where the group of two or more nodes includes the first node. In such examples, in sending the linearly independent columns of the repair matrix to the first node, failure module 16 may send the linearly independent columns of the repair matrix to each of the group of two or more nodes concurrently.

In some examples, an achievable trade-off of the distributed storage system is independent of n. By increasing the number of nodes n in the system, the number of problem constraints grows quickly. The determinant codes introduced in techniques described herein do not have such limitations. By adding more nodes in the system, the system will be robust against a higher number of node failures.

In some examples, in multiplying the content matrix for the respective helper node by the repair-encoder matrix to obtain the repair matrix, failure module 16 may perform a linear multiplication. This is a desirable property from the practical perspective, in order to provide a computationally feasible encoding/decoding as well as system maintenance.

In some examples, the determinant code may be optimum for d=k, in the sense that the achievable trade-off is matching with a known lower bound for linear exact-regenerating codes. As a consequence, the optimum linear trade-off for regenerating codes with d=k is fully characterized.

In some examples, a required mathematical field size for the determinant code may be linear. As a larger field size, there is a higher demand for a larger amount of files to be grouped and encoded. This will reduce the flexibility of the system design.

In some examples, the linearly independent columns of the repair matrix for each helper node may be independent of every other helper node. That is, the data sent from each helper node only depends on the identity of the helper node and failed nodes, but is independent from the identity of other helper nodes participating in the repair process.

In some examples, failure module 16 may further concatenate a plurality of determinant codes to construct a merged determinant code, where each of the plurality of determinant codes is a d=k determinant code, and where the merged determinant code is a d>=k determinant code.

In some examples, a number of code parameters for the determinant code may be less than or equal to (d−k+1)^(k), which is independent of the number of the parity nodes.

While described as occurring in helper node 12, the techniques described above would be performed by each of the d helper nodes upon detecting the failure of the node.

FIG. 10 is a flow diagram of one or more techniques of the current disclosure. The operations of FIG. 10 may be performed by one or more processors of a computing device, such as node device 12 of FIG. 9. For purposes of illustration only, FIG. 10 is described below within the context of node device 12 of FIG. 9.

In accordance with the techniques described herein, detecting (130) a failure in a first node of a distributed storage system comprising a plurality of nodes. A total number of nodes in the distributed storage system is represented by n, a file stored in the distributed storage system is recovered from a subset of a number of nodes represented by k upon a file failure on a node in the distributed storage system, and a failed node in the plurality of nodes is recovered from a number of helper nodes of the plurality of nodes represented by d. Node device 12 in the distributed storage system, for a particular mode of a determinant code, the particular mode represented by m, determines (132) a repair-encoder matrix having a number of rows based on a number of m-element subsets of d and having a number of columns based on a number of m−1-element subsets of d. Node device 12 multiplies (134) a content matrix for the respective helper node by the repair-encoder matrix to obtain a repair matrix, wherein a maximum number represented by b columns of the repair matrix are linearly independent, wherein b is based on a number of m−1-element subsets of d−1. Node device 12 extracts (136) each linearly independent column of the repair matrix. Node device 12 sends (138) the linearly independent columns of the repair matrix to the first node.

The following numbered examples demonstrate one or more aspects of the disclosure.

Example 1. A distributed storage system comprising: a plurality of nodes comprising a first node and a number of helper nodes, wherein a total number of nodes in the distributed storage system is represented by n, wherein a file stored in the distributed storage system is recovered from a subset of a number of nodes represented by k upon a file failure on a node in the distributed storage system, and wherein a failed node in the plurality of nodes is recovered from the number of helper nodes of the plurality of nodes represented by d, wherein upon detecting a failure in the first node, each helper node of the number of helper nodes is configured to: for a particular mode of a determinant code, the particular mode represented by m, determine, by the respective helper node, a repair-encoder matrix having a number of rows based on a number of m-element subsets of d and having a number of columns based on a number of m−1-element subsets of d; multiply, by the respective helper node, a content matrix for the respective helper node by the repair-encoder matrix to obtain a repair matrix, wherein a maximum number represented by b columns of the repair matrix are linearly independent, wherein b is based on a number of m−1-element subsets of d−1; extract, by the respective helper node, each linearly independent column of the repair matrix; and send, by the respective helper node, the linearly independent columns of the repair matrix to the first node.

Example 2. The distributed storage system of example 1, wherein the content matrix comprises a product of an encoder matrix and a message matrix.

Example 3. The distributed storage system of example 2, wherein the encoder matrix is common to each of the helper nodes, and wherein the message matrix is unique for every helper node.

Example 4. The distributed storage system of any of examples 2-3, wherein the encoder matrix comprises a fixed matrix having n rows and d columns, and wherein the encoder matrix is maximum-distance-separable.

Example 5. The distributed storage system of any of examples 2-4, wherein the message matrix has d rows, and wherein one or more entries of the message matrix comprise one or more of a source symbol or a parity symbol.

Example 6. The distributed storage system of any of examples 1-5, wherein the number of rows in the repair-encoder matrix is equal to the number of m-element subsets of d and the number of columns in the repair-encoder matrix is equal to the number of m−1-element subsets of d.

Example 7. The distributed storage system of any of examples 1-6, wherein b is equal to a number of m−1-element subsets of d−1.

Example 8. The distributed storage system of any of examples 1-7, wherein to send the linearly independent columns of the repair matrix to the first node, the respective helper node is configured to send only the linearly independent columns of the repair matrix to the first node, wherein the linearly independent columns of the repair matrix form a repair space of the first node.

Example 9. The distributed storage system of any of examples 1-8, wherein each linearly independent column comprises a repair-data vector.

Example 10. The distributed storage system of any of examples 1-9, wherein to detect the failure in the first node, the distributed storage system is configured to detect a failure in each of a group of two or more nodes in the plurality of nodes, wherein the group of two or more nodes includes the first node, and wherein to send the linearly independent columns of the repair matrix to the first node, the respective helper node sends the linearly independent columns of the repair matrix to each of the group of two or more nodes concurrently.

Example 10. The distributed storage system of any of examples 1-9, wherein to detect the failure in the first node, the distributed storage system is configured to detect a failure in each of a group of two or more nodes in the plurality of nodes, wherein the group of two or more nodes includes the first node, and wherein to send the linearly independent columns of the repair matrix to the first node, the respective helper node sends the linearly independent columns of the repair matrix to each of the group of two or more nodes concurrently.

Example 11. The distributed storage system of any of examples 1-10, wherein an achievable trade-off of the distributed storage system is independent of n.

Example 12. The distributed storage system of any of examples 1-11, wherein to multiply the content matrix for the respective helper node by the repair-encoder matrix to obtain the repair matrix, the respective helper node is configured to perform a linear multiplication.

Example 13. The distributed storage system of any of examples 1-12, wherein the determinant code is optimum for d=k.

Example 14. The distributed storage system of any of examples 1-13, wherein a required mathematical field size for the determinant code is linear.

Example 15. The distributed storage system of any of examples 1-14, wherein the linearly independent columns of the repair matrix for each helper node is independent of every other helper node.

Example 16. The distributed storage system of any of examples 1-15, wherein the distributed storage system is further configured to concatenate a plurality of determinant codes to construct a merged determinant code, wherein each of the plurality of determinant codes comprises a d=k determinant code, and wherein the merged determinant code comprises a d>=k determinant code.

Example 17. The distributed storage system of any of examples 1-16, wherein a number of code parameters for the determinant code is less than or equal to (d−k+1)^(k).

Example 18. A method comprising: upon detecting a failure in a first node of a distributed storage system comprising a plurality of nodes and a number of helper nodes, wherein a total number of nodes in the distributed storage system is represented by n, wherein a file stored in the distributed storage system is recovered from a subset of a number of nodes represented by k upon a file failure on a node in the distributed storage system, and wherein a failed node in the plurality of nodes is recovered from the number of helper nodes of the plurality of nodes represented by d, and for each helper node in the distributed storage system: for a particular mode of a determinant code, the particular mode represented by m, determining, by the respective helper node, a repair-encoder matrix having a number of rows based on a number of m-element subsets of d and having a number of columns based on a number of m−1-element subsets of d; multiplying, by the respective helper node, a content matrix for the respective helper node by the repair-encoder matrix to obtain a repair matrix, wherein a maximum number represented by b columns of the repair matrix are linearly independent, wherein b is based on a number of m−1-element subsets of d−1; extracting, by the respective helper node, each linearly independent column of the repair matrix; and sending, by the respective helper node, the linearly independent columns of the repair matrix to the first node.

Example 19. The method of example 18, wherein the content matrix comprises a product of an encoder matrix and a message matrix.

Example 20. A system comprising: at least one processor; and a computer-readable storage medium storing instructions that are executable by the at least one processor to: detect a failure in a first node of a plurality of nodes in a distributed storage system, wherein a total number of the plurality of nodes in the distributed storage system is represented by n, wherein a file stored in the distributed storage system is recovered from a subset of a number of nodes represented by k upon a file failure on a node in the distributed storage system, and wherein a failed node in the plurality of nodes is recovered from a number of helper nodes of the plurality of nodes represented by d; for a particular mode of a determinant code, the particular mode represented by m, determine, by a helper node, a repair-encoder matrix having a number of rows based on a number of m-element subsets of d and having a number of columns based on a number of m−1-element subsets of d; multiply, by the helper node, a content matrix for the helper node by the repair-encoder matrix to obtain a repair matrix, wherein a maximum number represented by b columns of the repair matrix are linearly independent, wherein b is based on a number of m−1-element subsets of d−1; extract, by the helper node, each linearly independent column of the repair matrix; and send, by the helper node, the linearly independent columns of the repair matrix to the first node.

In one or more examples, the functions described may be implemented in hardware, software, firmware, or any combination thereof. If implemented in software, the functions may be stored on or transmitted over as one or more instructions or code on a computer-readable medium and executed by a hardware-based processing unit. Computer-readable media may include computer-readable storage media, which corresponds to a tangible medium such as data storage media, or communication media including any medium that facilitates transfer of a computer program from one place to another, e.g., according to a communication protocol. In this manner, computer-readable media generally may correspond to (1) tangible computer-readable storage media which is non-transitory or (2) a communication medium such as a signal or carrier wave. Data storage media may be any available media that can be accessed by one or more computers or one or more processors to retrieve instructions, code and/or data structures for implementation of the techniques described in this disclosure. A computer program product may include a computer-readable medium.

By way of example, and not limitation, such computer-readable storage media can comprise RAM, ROM, EEPROM, CD-ROM or other optical disk storage, magnetic disk storage, or other magnetic storage devices, flash memory, or any other medium that can be used to store desired program code in the form of instructions or data structures and that can be accessed by a computer. Also, any connection is properly termed a computer-readable medium. For example, if instructions are transmitted from a website, server, or other remote source using a coaxial cable, fiber optic cable, twisted pair, digital subscriber line (DSL), or wireless technologies such as infrared, radio, and microwave, then the coaxial cable, fiber optic cable, twisted pair, DSL, or wireless technologies such as infrared, radio, and microwave are included in the definition of medium. It may be understood, however, that computer-readable storage media and data storage media do not include connections, carrier waves, signals, or other transitory media, but are instead directed to non-transitory, tangible storage media. Disk and disc, as used herein, includes compact disc (CD), laser disc, optical disc, digital versatile disc (DVD), floppy disk and Blu-ray disc, where disks usually reproduce data magnetically, while discs reproduce data optically with lasers. Combinations of the above should also be included within the scope of computer-readable media.

Instructions may be executed by one or more processors, such as one or more digital signal processors (DSPs), general purpose microprocessors, application specific integrated circuits (ASICs), field programmable logic arrays (FPGAs), or other equivalent integrated or discrete logic circuitry. Accordingly, the term “processor,” as used herein may refer to any of the foregoing structure or any other structure suitable for implementation of the techniques described herein. In addition, in some aspects, the functionality described herein may be provided within dedicated hardware and/or software modules configured for encoding and decoding, or incorporated in a combined codec. Also, the techniques could be fully implemented in one or more circuits or logic elements.

The techniques of this disclosure may be implemented in a wide variety of devices or apparatuses, including a wireless handset, an integrated circuit (IC) or a set of ICs (e.g., a chip set). Various components, modules, or units are described in this disclosure to emphasize functional aspects of devices configured to perform the disclosed techniques, but do not necessarily require realization by different hardware units. Rather, as described above, various units may be combined in a codec hardware unit or provided by a collection of interoperative hardware units, including one or more processors as described above, in conjunction with suitable software and/or firmware.

Various examples of the disclosure have been described. Any combination of the described systems, operations, or functions is contemplated. These and other examples are within the scope of the following claims. 

What is claimed is:
 1. A distributed storage system comprising: a plurality of nodes comprising a first node and a number of helper nodes, wherein a total number of nodes in the distributed storage system is represented by n, wherein a file stored in the distributed storage system is recovered from a subset of a number of nodes represented by k upon a file failure on a node in the distributed storage system, and wherein a failed node in the plurality of nodes is recovered from the number of helper nodes of the plurality of nodes represented by d, wherein upon detecting a failure in the first node, each helper node of the number of helper nodes is configured to: for a particular mode of a determinant code, the particular mode represented by m, determine, by the respective helper node, a repair-encoder matrix having a number of rows based on a number of m-element subsets of d and having a number of columns based on a number of m−1-element subsets of d; multiply, by the respective helper node, a content matrix for the respective helper node by the repair-encoder matrix to obtain a repair matrix, wherein a maximum number represented by b columns of the repair matrix are linearly independent, wherein b is based on a number of m−1-element subsets of d−1; extract, by the respective helper node, each linearly independent column of the repair matrix; and send, by the respective helper node, the linearly independent columns of the repair matrix to the first node.
 2. The distributed storage system of claim 1, wherein the content matrix comprises a product of an encoder matrix and a message matrix.
 3. The distributed storage system of claim 2, wherein the encoder matrix is common to each of the helper nodes, and wherein the message matrix is unique for every helper node.
 4. The distributed storage system of claim 2, wherein the encoder matrix comprises a fixed matrix having n rows and d columns, and wherein the encoder matrix is maximum-distance-separable.
 5. The distributed storage system of claim 2, wherein the message matrix has d rows, and wherein one or more entries of the message matrix comprise one or more of a source symbol or a parity symbol.
 6. The distributed storage system of claim 1, wherein the number of rows in the repair-encoder matrix is equal to the number of m-element subsets of d and the number of columns in the repair-encoder matrix is equal to the number of m−1-element subsets of d.
 7. The distributed storage system of claim 1, wherein b is equal to a number of m−1-element subsets of d−1.
 8. The distributed storage system of claim 1, wherein to send the linearly independent columns of the repair matrix to the first node, the respective helper node is configured to send only the linearly independent columns of the repair matrix to the first node, wherein the linearly independent columns of the repair matrix form a repair space of the first node.
 9. The distributed storage system of claim 1, wherein each linearly independent column comprises a repair-data vector.
 10. The distributed storage system of claim 1, wherein to detect the failure in the first node, the distributed storage system is configured to detect a failure in each of a group of two or more nodes in the plurality of nodes, wherein the group of two or more nodes includes the first node, and wherein to send the linearly independent columns of the repair matrix to the first node, the respective helper node sends the linearly independent columns of the repair matrix to each of the group of two or more nodes concurrently.
 11. The distributed storage system of claim 1, wherein an achievable trade-off of the distributed storage system is independent of n.
 12. The distributed storage system of claim 1, wherein to multiply the content matrix for the respective helper node by the repair-encoder matrix to obtain the repair matrix, the respective helper node is configured to perform a linear multiplication.
 13. The distributed storage system of claim 1, wherein the determinant code is optimum for d=k.
 14. The distributed storage system of claim 1, wherein a required mathematical field size for the determinant code is linear.
 15. The distributed storage system of claim 1, wherein the linearly independent columns of the repair matrix for each helper node is independent of every other helper node.
 16. The distributed storage system of claim 1, wherein the distributed storage system is further configured to: concatenate a plurality of determinant codes to construct a merged determinant code, wherein each of the plurality of determinant codes comprises a d=k determinant code, and wherein the merged determinant code comprises a d>=k determinant code.
 17. The distributed storage system of claim 1, wherein a number of code parameters for the determinant code is less than or equal to (d−k+1)^(k).
 18. A method comprising: upon detecting a failure in a first node of a distributed storage system comprising a plurality of nodes and a number of helper nodes, wherein a total number of nodes in the distributed storage system is represented by n, wherein a file stored in the distributed storage system is recovered from a subset of a number of nodes represented by k upon a file failure on a node in the distributed storage system, and wherein a failed node in the plurality of nodes is recovered from the number of helper nodes of the plurality of nodes represented by d, and for each helper node in the distributed storage system: for a particular mode of a determinant code, the particular mode represented by m, determining, by the respective helper node, a repair-encoder matrix having a number of rows based on a number of m-element subsets of d and having a number of columns based on a number of m−1-element subsets of d; multiplying, by the respective helper node, a content matrix for the respective helper node by the repair-encoder matrix to obtain a repair matrix, wherein a maximum number represented by b columns of the repair matrix are linearly independent, wherein b is based on a number of m−1-element subsets of d−1; extracting, by the respective helper node, each linearly independent column of the repair matrix; and sending, by the respective helper node, the linearly independent columns of the repair matrix to the first node.
 19. The method of claim 18, wherein the content matrix comprises a product of an encoder matrix and a message matrix.
 20. A system comprising: at least one processor; and a computer-readable storage medium storing instructions that are executable by the at least one processor to: detect a failure in a first node of a plurality of nodes in a distributed storage system, wherein a total number of the plurality of nodes in the distributed storage system is represented by n, wherein a file stored in the distributed storage system is recovered from a subset of a number of nodes represented by k upon a file failure on a node in the distributed storage system, and wherein a failed node in the plurality of nodes is recovered from a number of helper nodes of the plurality of nodes represented by d; for a particular mode of a determinant code, the particular mode represented by m, determine, by a helper node, a repair-encoder matrix having a number of rows based on a number of m-element subsets of d and having a number of columns based on a number of m−1-element subsets of d; multiply, by the helper node, a content matrix for the helper node by the repair-encoder matrix to obtain a repair matrix, wherein a maximum number represented by b columns of the repair matrix are linearly independent, wherein b is based on a number of m−1-element subsets of d−1; extract, by the helper node, each linearly independent column of the repair matrix; and send, by the helper node, the linearly independent columns of the repair matrix to the first node. 